В моем приложении Qt я сталкиваюсь со следующим сценарием:
Когда возникает конкретное событие, я показываю немодальное QDialog
который запрашивает у пользователя подтверждение.
Диалог показывается с помощью show()
функция от QMainWindow
,
В любое время событие поднимается и никаких других модальных QDialog
отображаются, пользователь может нажать кнопку подтверждения.
К сожалению, если модальный QDialog
видно, когда событие поднято, немодальное QDialog
недоступен Это означает, что пользователь не может нажать кнопку подтверждения.
Следующий код является упрощенной версией, которая вызывает ту же проблему
В этом примере QMainWindow
содержит кнопку, когда кнопка нажата модальной QDialog
показано с помощью exec()
функция в то же время QTimer
был начат
Каждый раз, когда я закрываю модальное QDialog
перед QTimer
истекло немодальное диалоговое окно. Если я подожду, пока не появится немодальное диалоговое окно без закрытия модального, немодальное диалоговое окно недоступно (мне нужно сначала закрыть модальное диалоговое окно).
Основной код Windows:
#include "mainwindow.h"#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_pModeless = new DialogModal(this);
connect(&m_qTimer,SIGNAL(timeout()),this,SLOT(TimerElapsed()));
}
MainWindow::~MainWindow()
{
delete m_pModeless;
delete ui;
}
void MainWindow::TimerElapsed()
{
m_qTimer.stop();
m_pModeless->show();
m_pModeless->activateWindow();
m_pModeless->raise();
m_pModeless->setFocus();
}
void MainWindow::on_pbStartTest_clicked()
{
m_qTimer.start(10000);
DialogModal d(this);
d.exec();
}
Заголовок MainWindow:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTimer>
#include "dialogmodal.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
QTimer m_qTimer;
DialogModal *m_pModeless;
private:
Ui::MainWindow *ui;
private slots:
void TimerElapsed();
void on_pbStartTest_clicked();
};
#endif // MAINWINDOW_H
DialogModal Заголовок:
#ifndef DIALOGMODAL_H
#define DIALOGMODAL_H
#include <QDialog>
namespace Ui {
class DialogModal;
}
class DialogModal : public QDialog
{
Q_OBJECT
public:
explicit DialogModal(QWidget *parent = 0);
~DialogModal();
private slots:
void on_pbExit_clicked();
private:
Ui::DialogModal *ui;
};
#endif // DIALOGMODAL_H
Источник DialogModal:
#include "dialogmodal.h"#include "ui_dialogmodal.h"
DialogModal::DialogModal(QWidget *parent) :
QDialog(parent),
ui(new Ui::DialogModal)
{
ui->setupUi(this);
}
DialogModal::~DialogModal()
{
delete ui;
}
void DialogModal::on_pbExit_clicked()
{
close();
}
Можно ли как-то сфокусировать немодальное диалоговое окно, даже если присутствует один или несколько модальных диалогов?
Я нашел рабочее решение:
void MainWindow::TimerElapsed()
{
QWidget *pwidget=NULL;
m_qTimer.stop();
foreach(pwidget,QApplication::topLevelWidgets())
{
if ((pwidget->isWindow())&&(pwidget->isModal()))
{
m_pModeless->setParent(pwidget);
}
}
if (pwidget==NULL)
{
m_pModeless->setParent(this);
}
m_pModeless->show();
m_pModeless->activateWindow();
m_pModeless->raise();
m_pModeless->setFocus();
}
Когда модальное диалоговое окно должно быть активировано (должно появиться), вы можете попробовать изменить родителя немодального диалога на это модальное диалоговое окно. Поскольку немодальное диалоговое окно будет иметь модальное диалоговое окно в качестве родительского, тогда есть вероятность, что оно будет сверху. Тем не менее, это также может зависеть от платформы.
Конечно, в идеале, чтобы избежать таких ситуаций