C++ 为什么Gtk::Frame强制重画&;调整大小?

C++ 为什么Gtk::Frame强制重画&;调整大小?,c++,c++11,gtk,gtkmm,C++,C++11,Gtk,Gtkmm,在包含的代码中,我创建了一个定期更新标签的应用程序。当应用程序首次启动时,更新timeLabel会导致重新绘制应用程序的全部内容。这可以通过使用--gtk debug=updates参数运行应用程序来观察 单击右侧的按钮时,包围窗口内容的框架将从小部件层次结构中移除。这将导致对timeLabel的进一步更新,只重新绘制标签,而不重新绘制交换按钮 为什么一个框架似乎想要重新绘制自己,即使它不需要这样做 #include <gtkmm.h> class MyWindow : publi

在包含的代码中,我创建了一个定期更新标签的应用程序。当应用程序首次启动时,更新timeLabel会导致重新绘制应用程序的全部内容。这可以通过使用--gtk debug=updates参数运行应用程序来观察

单击右侧的按钮时,包围窗口内容的框架将从小部件层次结构中移除。这将导致对timeLabel的进一步更新,只重新绘制标签,而不重新绘制交换按钮

为什么一个框架似乎想要重新绘制自己,即使它不需要这样做

#include <gtkmm.h>

class MyWindow
: public Gtk::Window
{
public:
    MyWindow();

private:
    bool timeout();
    void toggleUseOfFrame();

    Gtk::Frame frame;
    Gtk::Label timeLabel;
    Gtk::Button swapButton;
    Gtk::Box box;
};

MyWindow::MyWindow()
{
    // Layout widgets in initial configuration.
    box.pack_start( timeLabel, true, true );
    box.pack_start( swapButton, true, true );
    box.set_homogeneous();
    frame.add( box );
    add( frame );
    show_all();

    set_size_request( 100, 50 );

    // Setup signal handlers.
    Glib::MainContext::get_default()->signal_timeout().connect(
        sigc::mem_fun( *this, &MyWindow::timeout ), 1000 );

    swapButton.signal_clicked().connect(
        sigc::mem_fun( *this, &MyWindow::toggleUseOfFrame ) );
}


// Periodically update the label to force it to redraw.
bool MyWindow::timeout()
{
    Glib::DateTime now = Glib::DateTime::create_now_local();
    timeLabel.set_text( now.format( "%S" ) );
    return true;
}


// If the frame is currently in use remove it. Otherwise add it back.
void MyWindow::toggleUseOfFrame()
{
    if( frame.get_parent() ) {
        remove();
        box.reparent( *this );
    }
    else {
        box.reparent( frame );
        add( frame );
    }
}


int main( int argc, char* argv[]) {
    Glib::RefPtr<Gtk::Application> app =
        Gtk::Application::create( argc, argv, "test" );

    MyWindow myWindow;

    return app->run( myWindow );
}
#包括
类MyWindow
:public Gtk::Window
{
公众:
MyWindow();
私人:
bool超时();
void toggleUseOfFrame();
Gtk::框架;
Gtk::标签时间标签;
Gtk::按钮交换按钮;
Gtk::盒子;
};
MyWindow::MyWindow()
{
//在初始配置中布局小部件。
box.pack_start(timeLabel,true,true);
box.pack_start(swapButton,true,true);
box.set_齐次();
框架。添加(框);
添加(框架);
显示全部();
设置大小请求(100,50);
//设置信号处理程序。
Glib::MainContext::get_default()->signal_timeout()。连接(
sigc::mem_-fun(*this,&MyWindow::timeout),1000);
swapButton.signal_clicked().连接(
sigc::mem_-fun(*this,&MyWindow::toggleUseOfFrame));
}
//定期更新标签以强制其重新绘制。
bool MyWindow::timeout()
{
Glib::DateTime now=Glib::DateTime::create_now_local();
timeLabel.set_文本(现在为.format(“%S”);
返回true;
}
//如果框架当前正在使用,请将其删除。否则,请将其添加回。
void MyWindow::toggleUseOfFrame()
{
if(frame.get_parent()){
删除();
框。重新租赁(*本);
}
否则{
包装盒。重新包装(框架);
添加(框架);
}
}
int main(int argc,char*argv[]){
Glib::RefPtr应用程序=
Gtk::Application::create(argc,argv,“test”);
我的窗口我的窗口;
返回应用程序->运行(myWindow);
}

有趣的问题。你有没有想过这一点?没有。我的工作是节省使用框架,以减少重画尺寸,并保持我的应用程序快速运行。询问GTK+开发人员会很有趣;如果你有时间提交一个bug报告,他们最糟糕的做法就是解释并关闭它。(嗯,或者他们可以忽略它;-)我在浏览文档时找不到任何关于这方面的线索,而且总是有可能这不是故意的。有趣的问题。你有没有想过这一点?没有。我的工作是节省使用框架,以减少重画尺寸,并保持我的应用程序快速运行。询问GTK+开发人员会很有趣;如果你有时间提交一个bug报告,他们最糟糕的做法就是解释并关闭它。(嗯,或者他们可以忽略它;-)我在浏览文档时找不到任何关于这方面的线索,而且总是有可能这不是故意的。