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"按钮或其他取消操作  
}
相关推荐
小温冲冲2 小时前
QtObject 详解:QML 中的轻量级数据容器
qt
huwei8533 小时前
Q打印表格内容类
开发语言·qt
Quz8 小时前
QML 常用的基础容器组件(Pane、Frame、GroupBox、ScrollView 和 Page)
qt·交互
墨月白8 小时前
[QT] QT中的折线图和散点图
数据库·qt
问水っ9 小时前
Qt Creator快速入门 第三版 第16-7章 其他内容
开发语言·qt
Tianwen_Burning9 小时前
qt控件QVTKOpenGLNativeWidget全窗口显示
qt·pcl·halcon3d
小CC吃豆子10 小时前
Qt的信号与槽机制
开发语言·数据库·qt
qq_4017004110 小时前
Qt属性系统
开发语言·数据库·qt
默默前行的虫虫11 小时前
QT、html中的大屏可视化带源码
qt
郝学胜-神的一滴11 小时前
Qt实现圆角窗口的两种方案详解
开发语言·c++·qt·程序人生