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"按钮或其他取消操作
}