qt:dialog的accept()概念

本文详细讲解了Qt编程中的模式和非模式对话框,以及exec()、accept()函数的用法。非模式对话框允许用户同时与多个窗口交互,如查找替换对话框;模式对话框则会阻塞其他窗口直到关闭。通过exec()显示模式对话框,使用accept()或reject()控制对话框关闭并返回值。文中以一个实例展示了如何在子窗口中设置按键,点击后关闭子窗口并返回主窗口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇,会重点讲述模式对话框,以及exec()的用法,accept()和accepted的概念。

一.非模式对话框

非模式对话框是和同一个程序中其它窗口操作无关的对话框。在字处理软件中查找和替换对话框通常是非模式的来允许同时与应用程序主窗口和对话框进行交互。调用show()来显示非模式对话框。show()立即返回,这样调用代码中的控制流将会继续。在实践中你将会经常调用show()并且在调用show()的函数最后,控制返回主事件循环。

非模式对话框,说白了,就像你打开了好几个QQ聊天窗口,每个聊天窗口都是一个非模式对话框,想和谁聊和谁聊,只要点击那个窗口就可以输入聊天信息进行发送了。

二.模式对话框

模式对话框就是阻塞同一应用程序中其它可视窗口的输入的对话框:用户必须完成这个对话框中的交互操作并且关闭了它之后才能访问应用程序中的其它任何窗口。模式对话框有它们自己的本地事件循环。用来让用户选择一个文件或者用来设置应用程序参数的对话框通常是模式的。调用exec()来显示模式对话框。当用户关闭这个对话框,exec()将提供一个可用的返回值并且这时流程控制继续从调用exec()的地方进行。通常,我们连接默认按钮,例如“OK”到accept()槽并且把“Cancel”连接到reject()槽,来使对话框关闭并且返回适当的值。另外我们也可以连接done()槽,传递给它Accepted或Rejected。

非模式对话框,说白了,就像你打开QQ聊天窗口,如果这个窗口是模式对话框,那么完蛋了,你必须要先和这货聊完天,然后关闭这个窗口,你才能继续干其他的事情,否则,你根本无法去操作其他的窗口。

OK,下面举一个简单的例子:

1)创建一个widget的类,此为主窗口界面

2)再创建一个mydialog类,此为子窗口界面

那么,我希望在子窗口界面上做一个按键,一旦按下,子窗口界面消失,进入主窗口中。(QT教程与软件里面的第二章)

1.看下图,其中sender为该“进入主窗口”这个按键,clicked为按下这个按键要发送的信号。muyDialog为当前子类的对象,而accept为当前的槽函数。

连在一起的意思是,按下按键后,发送click的信号,然后accept这个槽函数收到信号,然后执行。accept()的作用是:将当前的窗口隐藏(这样就做到子窗口功能消失这个功能),并且发送accepted信号,也就是设置设置结果代码为Accepted。

2.在main函数中,写入如下代码:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;

    myDialog my1;      //创建一个指向子窗口的对象

    if(my1.exec() == QDialog::Accepted)
    {
        w.show();
        return a.exec();
    }
    else
    {
        return 0;
    }
}

首先,my1.exec()的意思是:执行模式对话框。按照之前对模式对话框的讲述,my1.exec()的意思就是,显示子窗口,并在这里阻塞住,知道该窗口被关闭之后,才继续往下运行!正因为在这里阻塞住了,所以才没有显示主窗口,因为w.show()没有被运行!后面就好理解了,当子窗口的那个按键按下后,发出accepted的信号,if(my1.exec() == QDialog::Accepted)这句话成立,所以子窗口关闭,继续执行到w.show()这句话,然后显示主窗口。

Dialog_Confirm_withButtons::Dialog_Confirm_withButtons(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog_Confirm_withButtons) { qDebug()<<"Dialog_Confirm_withButtons(QWidget *parent) start"; ui->setupUi(this); this->setWindowState(Qt::WindowFullScreen); setAttribute(Qt::WA_TranslucentBackground);//背景半透明属性设置 setAttribute(Qt::WA_StyledBackground);//似乎设置这个属性之后,更容易出现白条闪屏 setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint); setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); this->setFocusPolicy(Qt::StrongFocus); //QT类获取键盘焦点时才可以获取事件,当页面布局复杂时,焦点可能不在该类中。 this->setModal(true); this->move(((parent->frameGeometry().width() - this->frameGeometry().width())/2), ((parent->frameGeometry().height() - this->frameGeometry().height())/2)); ui->frame->move((this->width() - ui->frame->width())/2, (this->height() - ui->frame->height())/2); this->installEventFilter(this); qDebug()<<"Dialog_Confirm_withButtons(QWidget *parent) end"; } Dialog_Confirm_withButtons::~Dialog_Confirm_withButtons() { delete ui; } void Dialog_Confirm_withButtons::getShow() { this->show(); } void Dialog_Confirm_withButtons::showEvent(QShowEvent *event) { //窗口显示事件 this->msg = Message; ui->label_title->setText(this->Title); ui->label_msg->setText(this->Message); this->setFocus(); Q_UNUSED(event); QPainter painter(this); painter.drawPixmap(0,0,this->width(),this->height(),QPixmap("://images/bg_mask19201080.png")); } void Dialog_Confirm_withButtons::on_pushButton_OK_clicked() { this->accept(); } void Dialog_Confirm_withButtons::on_pushButton_Cancel_clicked() { this->reject(); } 编译报错 error: ‘class Dialog_Confirm_withButtons’ has no member named ‘msg’
03-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值