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"按钮或其他取消操作  
}
相关推荐
四维碎片1 天前
【Qt】UDP跨平台调试工具
qt·学习·udp
踏过山河,踏过海1 天前
【用ui文件做个简单工具的开发,为什么修改完ui后,程序重新编译运行后,GUI界面还是不变呢?】
qt·ui
向阳开的夏天1 天前
麒麟V10源码编译QT5.6.3 (x86 & arm64)
开发语言·qt
打码的猿1 天前
Qt对话框不锁死主程序的方法
开发语言·qt
小小码农Come on1 天前
Qt Creator常用设置
qt
wkm9561 天前
在arm64 ubuntu系统安装Qt后编译时找不到Qt3DExtras头文件
开发语言·arm开发·qt
小小码农Come on1 天前
QT开发环境安装
开发语言·qt
小小码农Come on1 天前
QT内存管理
开发语言·qt
有理想的打工人1 天前
QT的安装
qt
SilentSlot2 天前
【QT-QML】8. 输入元素
qt·qml