如果多次点击 QPushButton,会重复创建 MyDialog 对象并显示出来,这可能不是我们想要的结果。为了避免这种情况,可以将 MyDialog 对象定义为 MainWindow 类的成员变量,并在 onButtonClick() 函数中检查该对象是否已经被创建过,如果已经创建过,则只需要将其显示出来即可。
以下是修改后的代码示例:
#include <QApplication>
#include <QDialog>
#include <QPushButton>
class MyDialog : public QDialog
{
public:
MyDialog(QWidget *parent = nullptr) : QDialog(parent)
{
setWindowTitle("My Dialog");
setGeometry(100, 100, 300, 200);
}
};
class MainWindow : public QWidget
{
public:
MainWindow(QWidget *parent = nullptr) : QWidget(parent), m_dialog(nullptr)
{
initUI();
}
private:
void initUI()
{
setWindowTitle("Main Window");
setGeometry(100, 100, 300, 200);
QPushButton *button = new QPushButton("Open Dialog", this);
button->move(100, 100);
connect(button, &QPushButton::clicked, this, &MainWindow::onButtonClick);
}
void onButtonClick()
{
if (!m_dialog) { // 如果 m_dialog 没有被创建过,则创建它
m_dialog = new MyDialog(this);
m_dialog->setAttribute(Qt::WA_DeleteOnClose); // 设置关闭时自动删除对象
connect(m_dialog, &QDialog::finished,
this, [this]() { m_dialog = nullptr; }); // 连接 finished 信号和槽函数,当对话框关闭时清空指针
}
m_dialog->show();
}
private:
MyDialog *m_dialog;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
这段代码将 MyDialog 对象定义为 MainWindow 类的成员变量,并在 onButtonClick() 函数中检查该对象是否已经被创建过。如果没有被创建过,则创建它并设置关闭时自动删除对象,同时连接其 finished 信号和槽函数,当对话框关闭时清空指针。如果已经被创建过,则直接将其显示出来。
通过这种方式,即使多次点击 QPushButton,也只会创建一个 MyDialog 对象并重复使用它。