2011-10-28 35 views
12

我正在寻找类似QDialog的完成信号,仅适用于QWidget。原因是,一旦小部件弹出后我就禁用了我的工具栏(这根本不是问题),并且我希望工具栏在小部件关闭后再次启用。需要类似QWidget的完成信号

我也无法重写该小部件的close-Event,因为那样我们就会在业务类中拥有GUI代码。

+1

从小部件发出信号?或者抓住'destroy()'信号? – RedX

+2

你的最后一行没有意义。小部件是GUI项目,其关闭事件是GUI代码。为什么重写会导致GUI和业务逻辑的混合? – Mat

回答

14

您可以设置窗口小部件被关闭时删除,然后听其destroyed信号:

widget->setAttribute(Qt::WA_DeleteOnClose); 
connect(widget, SIGNAL(destroyed(QObject*)), this, SLOT(widgetDestroyed(QObject*))); 

这只是如果您对小部件内容不感兴趣,则可以使用。在发射点destroyed()时,小工具不再是QWidget,而只是QObject(因为destroyed()~QObject发出),所以您不能再将参数QObject*转换为QWidget

一个简单的替代方案可能是将你的小部件包装成QDialog

+0

第一个工作得很好,谢谢。 – LarissaGodzilla

+0

嗨,弗兰克,我该如何实现'widgetDestroyed'插槽? – SexyBeast

+0

这取决于当小部件被销毁时你想要做什么,没有通用的答案在插槽中做什么。 –

0

QWidget实际上并没有很多信号,根据文档它总共有2个。但是,这并不意味着你不能自己指定一个信号并使用它,这可能是最好的方法。

9

在你的Widget类中,你可以添加自己的信号,其他人可以连接到。然后覆盖closeEvent()方法。不要担心压倒这种方法,这种情况的确是正确的原因。

class MyCustomWidget: public QWidget 
{ 
    Q_OBJECT 

    ... 

    signals: 
     void WidgetClosed(); 

    protected: 

    //=============================================================== 
    // Summary: Overrides the Widget close event 
    // Allows local processing before the window is allowed to close. 
    //=============================================================== 
    void closeEvent(QCloseEvent *event); 

    } 

closeEvent方法触发信号:

void MyCustomWidget::closeEvent(QCloseEvent *event) 
{ 
     emit WidgetClosed(); 
     event->accept(); 
} 
+0

我已经这样做了,但由于某种原因,我可能没有理解得和我想的一样,我的团队领导者并没有这样想。但是我会和他谈谈这件事,看到其他可能的方式让事情变得不那么重要。 – LarissaGodzilla