3

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

4

2 に答える 2

7

私は実用的な解決策を見つけました:

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();
}
于 2014-02-07T14:41:47.727 に答える
1

モーダル ダイアログをアクティブにする (表示しようとしている) 場合、モードレス ダイアログの親をこのモーダル ダイアログに変更してみてください。モードレス ダイアログはモーダル ダイアログを親として持つため、それを上に持つ可能性があります。それでも、プラットフォームに依存する場合もあります。

もちろん、理想的にはそのような状況を避けるために

于 2014-02-06T17:57:00.153 に答える