Gtk4迁移问题:Gtk.ApplicationWindow无法作为对话框父窗口
Gtk4迁移中对话框模态失效的原因及解决方法
问题原因
在Gtk4中,Gtk.MessageDialog构造函数的parent参数不再自动将对话框设置为父窗口的临时子窗口(transient parent)。而模态对话框必须依赖有效的临时父窗口才能正常生效——没有这个层级关联,系统无法识别对话框与主窗口的从属关系,导致模态设置失效,同时抛出“GtkDialog mapped without a transient parent”的警告。
尽管Gtk.ApplicationWindow是Gtk.Window的子类,但Gtk4的API重构打破了Gtk3中通过构造函数parent参数隐式建立临时父子关系的逻辑,所以即使你传入了self.window,也无法触发预期的模态行为。
解决方法
方法1:显式设置临时父窗口
创建对话框后,手动调用set_transient_for()方法关联主窗口:
dialog = Gtk.MessageDialog( modal=True, destroy_with_parent=True, message_type=Gtk.MessageType.ERROR, buttons=Gtk.ButtonsType.OK, text='Access denied' ) dialog.set_transient_for(self.window) dialog.present()
方法2:通过Gtk.Application创建对话框
利用Gtk.Application的create_dialog()方法,它会自动将对话框关联到应用的主窗口,无需手动设置父窗口:
dialog = self.create_dialog( modal=True, destroy_with_parent=True, message_type=Gtk.MessageType.ERROR, buttons=Gtk.ButtonsType.OK, text='Access denied' ) dialog.present()
两种方法都能解决模态失效的问题,同时消除控制台警告。
内容的提问来源于stack exchange,提问作者Heschy
相关产品推荐
相关产品推荐

