Qt: Как сделать акцент на немодальном QDialog, созданном из главного окна, когда главное окно заблокировано модальным QDialog

В моем приложении 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();
}

Можно ли как-то сфокусировать немодальное диалоговое окно, даже если присутствует один или несколько модальных диалогов?

3

Решение

Я нашел рабочее решение:

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();
}
6

Другие решения

Когда модальное диалоговое окно должно быть активировано (должно появиться), вы можете попробовать изменить родителя немодального диалога на это модальное диалоговое окно. Поскольку немодальное диалоговое окно будет иметь модальное диалоговое окно в качестве родительского, тогда есть вероятность, что оно будет сверху. Тем не менее, это также может зависеть от платформы.

Конечно, в идеале, чтобы избежать таких ситуаций

1

По вопросам рекламы [email protected]