QT用QWidget实现类似QDialog::exec()模态对话框的效果
话不多说,直接上代码!
h文件
public:
//循环阻塞
int exec();
public slots:
//按键响应
void on_pBtn_OK_clicked();
void on_pBtn_Cancel_clicked();
private slots:
//重写窗口关闭事件
void closeEvent(QCloseEvent *event);
private:
//事件变量
QEventLoop *m_Loop;
//反映窗口结束类型的变量
int m_nResult;
构造函数中使窗口置顶 this->setWindowModality(Qt::ApplicationModal);
cpp文件
void CMyWidget::on_pBtn_OK_clicked()
{
m_nResult= 1;
this->close();
}
void CMyWidget::on_pBtn_Cancel_clicked()
{
m_nResult= 0;
this->close();
}
void CMyWidget::closeEvent(QCloseEvent *event)
{
if (m_Loop != NULL)
{
m_Loop->exit();
}
event->accept();
}
int CMyWidget::exec()
{
m_nResult= -1;
this->show();
m_Loop = new QEventLoop(this);
m_Loop->exec();
return m_nResult;
}
小结
利用QEventLoop::exec()实现程序阻塞的功能,窗体close()手动触发closeEvent事件,根据点击确定还是取消,赋值给m_nResult,再return这个值给外面知道,从而决定下一步程序走向。