私の Qt アプリケーションでは、次のシナリオに直面しています。特定のイベントが発生QDialog
すると、ユーザーに確認を求めるモードレスを表示します。ダイアログは、show()
の関数を使用して表示されQMainWindow
ます。イベントが発生し、他のモーダルQDialog
が表示されていないときはいつでも、ユーザーは確認ボタンをクリックできます。残念ながらQDialog
、イベントが発生したときにモーダルが表示されている場合、モードレスQDialog
にはアクセスできません。これは、ユーザーが確認ボタンをクリックできないことを意味します。次のコードは、同じ問題を引き起こす単純化されたバージョンです。この例でQMainWindow
は、ボタンが含まれており、ボタンがクリックされると、その間に関数QDialog
を使用してモーダルが表示されます。モーダルを閉じるたびにexec()
QTimer
QDialog
が経過する前にQTimer
、モードレス ダイアログにアクセスできます。モーダル ダイアログを閉じずにモードレス ダイアログが表示されるまで待機すると、モードレス ダイアログにアクセスできなくなります (最初にモーダル ダイアログを閉じる必要があります)。
MainWindows コード:
#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();
}
1 つ以上のモーダル ダイアログが存在する場合でも、モードレス ダイアログにフォーカスを与える方法はありますか?