当父项最小化时,保持QDialog打开?

时间:2016-01-18 20:23:51

标签: c++ qt qmainwindow qdialog

我有QMainWindow张开QDialog(非模态)。当我最小化主窗口时,对话框也会关闭。我可以以某种方式保持开放吗? (反之亦然Keep QMainWindow minimized when QDialogs show())。

我尝试过的一件事是ignore事件,但令我惊讶的是,我从未见过这样的状态。实际上我只看到ActivationChange (0n99)

    void CMyDialog::changeEvent(QEvent *evt)
    {
        QEvent::Type t = evt->type();
        if (t == QEvent::WindowStateChange)
        {
            evt->ignore();
            hide();
        }
        else
        {
            QDialog::changeEvent(evt);
        }
    }

Qt中心处理类似主题的问题: http://www.qtcentre.org/threads/24765-Intercept-minimize-window-event

在这里,我将其创建为成员:

QScopedPointer<MyDialog> m_navigator{new MyDialog(this)}; // this here is the main application window

它由公共插槽显示:

void MyDialog::toogleNavigator()
{
   this->setVisible(!this->isVisible());
}

并且是QDialog派生类:

class MyDialog : public QDialog { ...

----编辑2 ------

首先Wouter提到了它,然后亚历山大。就像你们说的那样,如果我传递没有父级(如亚历山大的最小例子中),对话框保持打开状态 - 父级将与父级一起最小化。我向Wouter道歉。

然而,就我而言,它并不像那样。所以我没有在没有检查或意图不好的情况下转向Wouter的评论。现在我有责任找出原因。我怀疑一些实用程序类来改变对话框。当我找到根本原因时,我会在这里报告。

好的,这是Windows标志。如果对话框是一个工具窗口,它总是最小化,因为它取决于父窗口的正常窗口。

1 个答案:

答案 0 :(得分:1)

尝试在不使用(MainApplication)的情况下创建MyDialog 并且可以使用构造函数的第二个参数进行播放。

new MyDialog(0/*, ?*/);

添加这是工作代码

MainWindow.cpp

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    QScopedPointer<Dialog> dialog;
};

MainWindow.hpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    dialog(new Dialog(0))
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    dialog->setVisible(!dialog->isVisible());
}