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 小时前
记一次控件提升后,运行却不显示的Bug
qt
FL16238631293 小时前
[深度学习][python]yolov11+bytetrack+pyqt5实现目标追踪
深度学习·qt·yolo
优雅的小武先生8 小时前
QT中的按钮控件和comboBox控件和spinBox控件无法点击的bug
开发语言·qt·bug
Death2008 小时前
使用Qt进行TCP和UDP网络编程
网络·c++·qt·tcp/ip
海绵波波10710 小时前
Qt操作主/从视图及XML——实例:汽车管理系统
xml·qt·汽车
Fairy_sevenseven10 小时前
【二十八】【QT开发应用】模拟WPS Tab
开发语言·qt·wps
Death20010 小时前
Qt 中的 QListWidget、QTreeWidget 和 QTableWidget:简化的数据展示控件
c语言·开发语言·c++·qt·c#
niu_sama11 小时前
基于muduo库函数实现protobuf协议的通信
开发语言·qt
不写八个11 小时前
Qt教程(001):Qt概述与安装
开发语言·qt
Death20011 小时前
Qt 3D、QtQuick、QtQuick 3D 和 QML 的关系
c语言·c++·qt·3d·c#