使用closeEvent for X按钮时如何关闭子窗口?

时间:2016-08-25 19:11:33

标签: c++ qt function

我在界面的右上角使用方法closeEvent作为X按钮。

window

要求是:

  • 当我点击“关闭” - >两个窗口(Exit和MainWindow)都将关闭。
  • 当我点击“取消” - >只有“退出”窗口将关闭,MainWindow仍然停留在那里。

但是当我点击“取消”时,两个窗口都关闭了 - >如何解决这个问题?

如何在“保存”和“关闭”之间移动“取消”按钮

dialog

这是我的代码

myclass.h

class MyClass : public QWidget
{
    Q_OBJECT

public:
    MyClass(QcgDatabase* db, int hostid, QWidget *parent = 0);
    ~MyClass();

public slots:
    void save_clicked();

private:
    Ui::MyClass ui;
    QMessageBox* dialog = NULL;
    void closeEvent(QCloseEvent *bar);
};

myclass.cpp

MyClass::MyClass(QcgDatabase * db, int hostid, QWidget *parent)
: QWidget(parent)
{
    ui.setupUi(this);
    .......
    .......
}

void MyClass::closeEvent(QCloseEvent *bar)
{
    if (!dialog) {
        dialog = new QMessageBox(this);
    }
    dialog->setWindowModality(Qt::WindowModal);
    dialog->setWindowTitle(QLatin1String("Exit"));
    dialog->setText(QLatin1String("You have not saved data. Click \"Close\" to close the data table."));
    dialog->setStandardButtons(QMessageBox::Save | QMessageBox::Cancel | QMessageBox::Close);

    int result = dialog->exec();
    if (result == QMessageBox::Save) {
        save_clicked();
    }
    else if (result == QMessageBox::Cancel) {
        dialog->close();
        return;
    }
    else if (result == QMessageBox::Close) {
        dialog->close();
    }

    bar->accept();
}

编辑:

好的,我用窗口修复了问题:

 else if (result == QMessageBox::Cancel) {
    bar->ignore();
    return;
 }

请帮我换掉“关闭”和“取消”按钮的位置!

1 个答案:

答案 0 :(得分:3)

if (result == QMessageBox::Cancel)分支中,仅关闭对话框是不够的。您还需要在事件对象上调用QEvent::ignore()

bar->ignore()

这是因为你的MyClass::closeEvent被调用只是为了让你有机会在窗口即将关闭时做一些事情,但事件本身将继续在Qt框架的迷宫中旅行,最终将导致窗口成为已关闭 - 除非您将其标记为被忽略