gpt4 book ai didi

qt - QMainWindow close() 信号未发出

转载 作者:行者123 更新时间:2023-12-01 16:23:24 25 4
gpt4 key购买 nike

为了在关闭从 QMainWindow 继承的窗口之前发出警告,我重新实现了它的 closeEvent,当我手动发出 close() 时,它可以正常工作。但是,单击“x”按钮不会触发此操作;它就退出了。

它确实为应用程序发出aboutToQuit(),我可以使用它在窗口关闭后“恢复”窗口。但我希望在最初关闭之前发出警告。

不知道问题出在哪里。该窗口是顶层窗口,没有正在运行的线程。我是否误解了实际连接到按钮单击的信号......?它 close(),对吗?

最佳答案

在主窗口类 header 中( closeEvent 必须是虚拟的):

public:
/*!
* \brief closeEvent
* \param event
*/
virtual void closeEvent ( QCloseEvent * event );

然后在cpp中

void MainWindow::closeEvent( QCloseEvent *event )
{
//! Ignore the event by default.. otherwise the window will be closed always.
event->ignore();

if(!EntitiesSaverObserver::Instance()->isAllSaved())
{
QMessageBox msgBox;
msgBox.setWindowIcon(QIcon(":/Resources/Icons/warning.png"));
msgBox.setIconPixmap(QPixmap(":/Resources/Icons/warning.png"));
QString strToShow = QString("Some Entities has been created or modified...");
msgBox.setText(strToShow);
msgBox.setInformativeText("Do you want to save your changes?");
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Save);
int ret = msgBox.exec();

switch (ret) {
case QMessageBox::Save:
{
// Save was clicked
qDebug() << "SAVE";
//! Do your stuff here
// ....
event->accept();
break;
}
case QMessageBox::Discard:
{
// Don't Save was clicked
qDebug() << "DISCARD";
event->accept();
break;
}
case QMessageBox::Cancel:
{
// Cancel was clicked
qDebug() << "CANCEL";
break;
}
default:
// should never be reached
break;
}
} else {
event->accept(); // Do not need to save nothing... accept the event and close the app
}
}

此外,如果您想在工具栏中放置一个按钮作为 QAction,您可以连接信号,然后:

void MainWindow::on_actionExit_triggered()
{
close();
}

这将调用主窗口的关闭事件。我希望这对您有帮助。

关于qt - QMainWindow close() 信号未发出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25454648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com