QT QDialog 中的按钮,如何按下后触发 accepted 消息?

QT 作为跨平台的系统,对话框并没有采用 Windows API 那种模式,通过返回 mrOK、mrCancel 等结果告诉调用方结果,而是采用了 accepted、rejected 等信号确定执行结果。下面介绍几种出发这些信号的方法。

1. 在按钮的 clicked 槽函数中触发 accepted 信号

在 Qt 的 QDialog 中,要实现在按下按钮后触发 accepted 信号,你通常需要将按钮的 clicked 信号连接到一个槽函数上,然后在该槽函数中调用 accept() 方法。以下是一个简单的示例代码,展示了如何实现这一功能:

cpp 复制代码
#include <QDialog>  
#include <QPushButton>  
  
class MyDialog : public QDialog {  
    Q_OBJECT  
  
public:  
    MyDialog(QWidget *parent = nullptr) : QDialog(parent) {  
        QPushButton *button = new QPushButton("OK", this);  
        connect(button, &QPushButton::clicked, this, &MyDialog::onButtonClicked);  
    }  
  
private slots:  
    void onButtonClicked() {  
        accept(); // 触发 accepted 信号  
    }  
};

2. 在 finished 槽函数中触发 acepted 信号

在 Qt 中,当 QDialog 关闭时,它会发出一个 finished 信号。如果你想在对话框关闭时执行特定的操作,可以将这个信号连接到一个槽函数上。

例如,你可以像这样定义一个槽函数:

cpp 复制代码
void MyClass::onDialogFinished(int result) {  
    if (result == QDialog::Accepted) {  
        // 对话框被接受,执行一些操作...  
    } else {  
        // 对话框被拒绝或以其他方式关闭,执行其他操作...  
    }  
}

然后,在对话框关闭时,你可以连接 finished 信号到这个槽函数:

cpp 复制代码
connect(myDialog, &QDialog::finished, this, &MyClass::onDialogFinished);

这样,无论 myDialog 是如何关闭的(通过 accept() 或 reject(),或者其他原因),onDialogFinished 函数都会被调用,并且可以根据返回的结果码执行相应的操作。

3. 在 exec() 后触发 accepted 信号

QDialog::exec() 是 Qt 框架中 QDialog 类的一个方法,用于显示对话框并进入模态循环。当对话框显示时,它会阻止用户与其他窗口交互,直到对话框被关闭。

当 exec() 被调用时,它会进入一个事件循环,等待用户与对话框进行交互(如点击按钮)。一旦用户与对话框完成交互(例如,点击了"OK"或"Cancel"按钮),exec() 方法会返回一个 int 类型的值,表示用户的操作结果。

返回值可能是以下之一:

  • Accepted:用户点击了"OK"按钮。
  • Rejected:用户点击了"Cancel"按钮或其他取消操作。

使用 exec() 的一个简单示例:

cpp 复制代码
QDialog dialog;  
dialog.setWindowTitle("示例对话框");  
dialog.setText("这是一个示例对话框。");  
dialog.setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);  
  
int result = dialog.exec();  
  
if (result == QDialog::Accepted) {  
    // 用户点击了"OK"按钮  
} else if (result == QDialog::Rejected) {  
    // 用户点击了"Cancel"按钮或其他取消操作  
}
相关推荐
lw向北.1 小时前
Qt For Android之环境搭建(Qt 5.12.11 Qt下载SDK的处理方案)
android·开发语言·qt
小灰灰搞电子2 小时前
Qt实现Android的图案密码(图形解锁)源码分享
开发语言·qt
kiiila12 小时前
【Qt】对象树(生命周期管理)和字符集(cout打印乱码问题)
开发语言·qt
黄金右肾15 小时前
Qt之数据库使用(十四)
sql·qt·sqlite·database
杨德杰17 小时前
QT多媒体开发(一):概述
qt·音视频·多媒体
小王爱吃月亮糖17 小时前
QT开发【常用控件1】-Layouts & Spacers
开发语言·前端·c++·qt·visual studio
864记忆17 小时前
关于opencv、Qt、msvc编译器之间的关系
人工智能·qt·opencv
矛取矛求1 天前
QT的前景与互联网岗位发展
开发语言·qt
Leventure_轩先生1 天前
[WASAPI]从Qt MultipleMedia来看WASAPI
开发语言·qt
晓纪同学1 天前
QT-简单视觉框架代码
开发语言·qt