簡體   English   中英

Qt:當主窗口被模式 QDialog 阻塞時,如何將焦點放在從主窗口創建的無模式 QDialog 上

[英]Qt: How to give focus to a modeless QDialog created from the main window when the main window is blocked by a modal QDialog

在我的 Qt 應用程序中,我面臨以下情況:當引發特定事件時,我會顯示一個無模式的QDialog ,要求用戶進行確認。 Dialog 是使用QMainWindow show()函數show() 每當引發事件並且沒有顯示其他模態QDialog ,用戶都可以單擊確認按鈕。 不幸的是,如果在引發事件時模態QDialog可見, QDialog模態QDialog將無法訪問。 這意味着用戶無法單擊確認按鈕。 以下代碼是導致相同問題的簡化版本 在此示例中, QMainWindow包含一個按鈕,當單擊該按鈕時,使用exec()函數顯示模態QDialog ,同時QTimer已啟動。 每當我在QTimer結束之前關閉模式QDialog ,無模式對話框都是可以訪問的。 如果我等到顯示無模式對話框而不關閉模態對話框,則無模式對話框將無法訪問(我需要先關閉模態對話框)。

主窗口代碼:

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

主窗口標題:

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

當模態對話框被激活(即將顯示)時,您可以嘗試將無模式對話框的父級更改為該模態對話框。 由於無模式對話框將模態對話框作為父級,因此有機會將其置於頂部。 不過它也可能取決於平台。

當然最好避免這種情況

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM