在 Gtk::Grid 中移动 Gtk::Widget 的位置

Posted

技术标签:

【中文标题】在 Gtk::Grid 中移动 Gtk::Widget 的位置【英文标题】:Move the position of a Gtk::Widget inside the Gtk::Grid 【发布时间】:2021-07-26 17:41:22 【问题描述】:

我想在网格内移动两个小部件的位置。我该怎么做?到目前为止我得到了什么:

        pWidget1->unparent();
        pWidget2->unparent();

        pGrid->attach(*(pWidget1), 0, 5);
        pGrid->attach(*(pWidget2), 0, 7);
        show_all();

遗憾的是,这段代码没有做我想做的事:小部件的位置没有改变。

【问题讨论】:

是的。程序中有许多按钮应该在拖放时更改它们在Gtk::Grid 中的位置 【参考方案1】:

下面的例子是用 Gtkmm 3.24 编写的,它创建了一个窗口,其中三个按钮在 Gtk::Grid 内共存。点击 Switch 按钮将在网格内交换 AB。这里的关键思想是

    Gtk::Grid::remove 要移动的小部件。 Gtk::Grid::attach他们到他们的新位置。

代码如下:

#include <iostream>
#include <gtkmm.h>

class MainWindow : public Gtk::Window


public:

    MainWindow()
    
        // Set buttons up:
        m_btnA.set_label("A");
        m_btnB.set_label("B");

        m_btnSwitch.set_label("Switch A and B");
        m_btnSwitch.signal_clicked().connect([this]()OnSwitch(););

        // Populate grid (initial layout):
        m_grid.attach(m_btnA, 0, 0, 1, 1);
        m_grid.attach(m_btnB, 1, 0, 1, 1);
        m_grid.attach(m_btnSwitch, 0, 1, 2, 1);

        // Set window up:
        add(m_grid);
        show_all();
    

private:

    void OnSwitch()
    
        std::cout << "Switching A and B in grid..." << std::endl;

        // First, remove the buttons from the grid:
        m_grid.remove(m_btnA);
        m_grid.remove(m_btnB);

        // Then, re-add them in reverse order:
        if(m_aBtnFirst)
        
            // Make "A" the second button:
            m_grid.attach(m_btnA, 1, 0, 1, 1);
            m_grid.attach(m_btnB, 0, 0, 1, 1);
        
        else
        
            // Make "A" the first button:
            m_grid.attach(m_btnA, 0, 0, 1, 1);
            m_grid.attach(m_btnB, 1, 0, 1, 1);
        

        // Update state:
        m_aBtnFirst = !m_aBtnFirst;

    

    Gtk::Grid m_grid;
    Gtk::Button m_btnA;
    Gtk::Button m_btnB;

    Gtk::Button m_btnSwitch;

    bool m_aBtnFirst = true;

;

int main(int argc, char *argv[])

    auto app = Gtk::Application::create(argc, argv, "org.gtkmm.moving.grid");
  
    MainWindow window;
  
    return app->run(window);

假设您将其添加到名为 main.cpp 的文件中,您可以使用以下命令构建它:

g++ main.cpp -o example.out `pkg-config --cflags --libs gtkmm-3.0`

【讨论】:

这将不必要地取消和实现移动的小部件。 @PBS 不必要地:请提供一个替代解决方案来避免该问题。 抱歉,“不必要”是指 GTK 的问题,而不是您的解决方案。没有其他办法。 GTK 需要为其添加一个函数。

以上是关于在 Gtk::Grid 中移动 Gtk::Widget 的位置的主要内容,如果未能解决你的问题,请参考以下文章

如何计算存储在 Gtk::Grid 中的小部件?

如何访问存储在 Gtk::Box / Gtk::Grid 中的 [i] 处的小部件?

使用 Gtk::Viewport (gtkmm3) 直接滚动

连接到实现信号:奇怪的窗口大小调整行为

如何在移动设备中显示移动视图?

如何在 iOS 中移动标记以及移动 Google 地图?