Why Does Gtk::Frame Force A Redraw & Resize?

好久不见. 提交于 2019-12-11 12:08:06

问题


In the included code I've created an application where I periodically update a label. When the application first starts up, updating the timeLabel results in redrawing the entire contents of the application. This can be observed by running the application with the --gtk-debug=updates argument.

When the button on the right side is clicked, the frame that encloses the contents of the window is removed from the widget hierarchy. This results in further updates to the timeLabel only redrawing the label, and not redrawing swapButton.

Why does a frame seem to want to redraw itself even if it doesn't need to?

#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 );
}

来源:https://stackoverflow.com/questions/34030423/why-does-gtkframe-force-a-redraw-resize

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!