gpt4 book ai didi

c++ - Qt:当主窗口被模式 QDialog 阻塞时,如何将焦点放在从主窗口创建的无模式 QDialog

转载 作者:太空狗 更新时间:2023-10-29 20:04:12 26 4
gpt4 key购买 nike

在我的 Qt 应用程序中,我面临以下情况:当引发特定事件时,我会显示一个无模式的 QDialog,它要求用户进行确认。使用 QMainWindow 中的 show() 函数显示对话框。任何时候引发事件并且没有显示其他模式 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 header :

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

关于c++ - Qt:当主窗口被模式 QDialog 阻塞时,如何将焦点放在从主窗口创建的无模式 QDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21609481/

26 4 0