最小化父级时保持 QDialog 打开?
Keep QDialog open when parent is minimized?
我有一个 QMainWindow
打开一个 QDialog
(非模态)。当我最小化主 window 时,对话框也会关闭。我能以某种方式让它保持打开状态吗? (反过来,如 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
由public槽显示:
void MyDialog::toogleNavigator()
{
this->setVisible(!this->isVisible());
}
并且是 QDialog
派生的 class:
class MyDialog : public QDialog { ...
---- 编辑 2 ------
Wouter 首先提到它,然后是 Alexander。就像你们说的那样,如果我传递 no parent(如在 Alexander 的最小示例中),对话框将保持打开状态 - 与 parent 一起最小化它的 parent。我向 Wouter 致歉。
但是,在我的情况下,它不是那样工作的。所以我没有在没有检查或恶意的情况下转过 Wouter 的评论。现在我有责任找出原因。我怀疑某些实用程序 classes 可以改变对话框。找到根本原因后,我会在这里报告。
好的,这是 windows 标志。如果对话框是一个工具 window,它总是最小化,正常情况下 window 它取决于父级。
尝试创建 MyDialog 而不是像父级那样 this(MainApplication)
并且可以使用构造函数的第二个参数。
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());
}
我有一个 QMainWindow
打开一个 QDialog
(非模态)。当我最小化主 window 时,对话框也会关闭。我能以某种方式让它保持打开状态吗? (反过来,如 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
由public槽显示:
void MyDialog::toogleNavigator()
{
this->setVisible(!this->isVisible());
}
并且是 QDialog
派生的 class:
class MyDialog : public QDialog { ...
---- 编辑 2 ------
Wouter 首先提到它,然后是 Alexander。就像你们说的那样,如果我传递 no parent(如在 Alexander 的最小示例中),对话框将保持打开状态 - 与 parent 一起最小化它的 parent。我向 Wouter 致歉。
但是,在我的情况下,它不是那样工作的。所以我没有在没有检查或恶意的情况下转过 Wouter 的评论。现在我有责任找出原因。我怀疑某些实用程序 classes 可以改变对话框。找到根本原因后,我会在这里报告。
好的,这是 windows 标志。如果对话框是一个工具 window,它总是最小化,正常情况下 window 它取决于父级。
尝试创建 MyDialog 而不是像父级那样 this(MainApplication) 并且可以使用构造函数的第二个参数。
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());
}