Почему Gtk::Frame вызывает перерисовку и изменение размера?

Во включенном коде я создал приложение, в котором периодически обновляю ярлык. При первом запуске приложения обновление timeLabel приводит к перерисовке всего содержимого приложения. Это можно наблюдать, запустив приложение с аргументом --gtk-debug=updates.

При нажатии на кнопку на правой стороне, рамка, которая содержит содержимое окна, удаляется из иерархии виджетов. Это приводит к дальнейшему обновлению timeLabel, только перерисовывая метку, а не перерисовывая swapButton.

Почему кадр, кажется, хочет перерисовать себя, даже если это не нужно?

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

0 ответов

Другие вопросы по тегам