我正在寻找类似QDialog
的完成信号,仅适用于QWidget
。原因是,一旦小部件弹出后我就禁用了我的工具栏(这根本不是问题),并且我希望工具栏在小部件关闭后再次启用。需要类似QWidget的完成信号
我也无法重写该小部件的close-Event,因为那样我们就会在业务类中拥有GUI代码。
我正在寻找类似QDialog
的完成信号,仅适用于QWidget
。原因是,一旦小部件弹出后我就禁用了我的工具栏(这根本不是问题),并且我希望工具栏在小部件关闭后再次启用。需要类似QWidget的完成信号
我也无法重写该小部件的close-Event,因为那样我们就会在业务类中拥有GUI代码。
您可以设置窗口小部件被关闭时删除,然后听其destroyed
信号:
widget->setAttribute(Qt::WA_DeleteOnClose);
connect(widget, SIGNAL(destroyed(QObject*)), this, SLOT(widgetDestroyed(QObject*)));
这只是如果您对小部件内容不感兴趣,则可以使用。在发射点destroyed()
时,小工具不再是QWidget
,而只是QObject
(因为destroyed()
从~QObject
发出),所以您不能再将参数QObject*
转换为QWidget
。
一个简单的替代方案可能是将你的小部件包装成QDialog
。
第一个工作得很好,谢谢。 – LarissaGodzilla
嗨,弗兰克,我该如何实现'widgetDestroyed'插槽? – SexyBeast
这取决于当小部件被销毁时你想要做什么,没有通用的答案在插槽中做什么。 –
QWidget实际上并没有很多信号,根据文档它总共有2个。但是,这并不意味着你不能自己指定一个信号并使用它,这可能是最好的方法。
在你的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();
}
我已经这样做了,但由于某种原因,我可能没有理解得和我想的一样,我的团队领导者并没有这样想。但是我会和他谈谈这件事,看到其他可能的方式让事情变得不那么重要。 – LarissaGodzilla
从小部件发出信号?或者抓住'destroy()'信号? – RedX
你的最后一行没有意义。小部件是GUI项目,其关闭事件是GUI代码。为什么重写会导致GUI和业务逻辑的混合? – Mat