Qt Window Focusing:关闭二级子窗口时主窗口不聚焦
Posted
技术标签:
【中文标题】Qt Window Focusing:关闭二级子窗口时主窗口不聚焦【英文标题】:Qt Window Focusing: Main window is not focused when second-level child window is closed 【发布时间】:2015-02-05 07:36:14 【问题描述】:首先,如果标题没有任何意义,请见谅。
所以基本上,我有一个主窗口(为简单起见,QMainWindow
实例标记为MainWindow
),它在某些时候创建了一个子窗口小部件(QWidget
实例标记为Widget1
)(为简单起见,这是在单击按钮)。
void MainWindow::on_pushButton_clicked()
Widget1 *w = new Widget1(this);
w->show();
Widget1
然后在某个时候创建另一个子小部件(QWidget
实例标记为 Widget2
,它与 Widget1
不同)(再次,为简单起见,这是通过单击按钮完成的)。
Widget1
从其子 (Widget2
) 接收一个 SIGNAL
,用于向其父 (MainWindow
) 发送另一个信号,并关闭自身。
void Widget1::on_pushButton_clicked()
Widget2 *w = new Widget2(this);
connect(w, SIGNAL(testSignalWidget2()), this, SIGNAL(testSignalWidget1()));
connect(w, SIGNAL(testSignalWidget2()), this, SLOT(close()));
w->show();
使用Widget2
后,它会向其父级(Widget1
)发出SIGNAL
,然后使用其this->close()
函数关闭。
void Widget2::on_pushButton_clicked()
emit testSignalWidget2();
this->close();
我的问题是,一旦这个过程完成,窗口焦点不在主窗口,而是在另一个打开的窗口上(如果没有打开其他窗口,这个过程显示任务栏,即使MainWindow
显示为全屏窗口)。作为参考,此问题仅发生在 Windows 设备上;这在我尝试过的 Ubuntu 设备上没有发生,我将其用作主要操作系统。我在所有单元上都使用了 Qt 4.7.3。
Widget1
和 Widget2
都使用以下代码来设置它们的窗口标志和模式:
this->setWindowFlags( Qt::Window | Qt::CustomizeWindowHint );
this->setWindowModality( Qt::WindowModal );
谁能指出我做错了什么?或者这种方法可能从一开始就是错误的,任何人都可以提供一些可以执行相同程序的替代方法吗?
编辑:
为了回答SaZ的评论,我把MainWindow
的电话改成了Widget1
如下:
void MainWindow::on_pushButton_clicked()
Widget1 *w = new Widget1(this);
connect(w, SIGNAL(testSignalWidget1()), this, SLOT(setFocus()));
w->show();
但是,这对问题没有影响。
编辑:
根据 SaZ,我已发布用于复制此问题的源代码。
首先,这是从 Qt 的自动生成的 Qt Gui 应用程序开始的。 Widget1
和 Widget2
都自动生成为 Qt Designer 表单类。
main.cpp
#include <QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
QApplication a(argc, argv);
MainWindow w;
// w.show();
w.showFullScreen();
return a.exec();
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui
class MainWindow;
class MainWindow : public QMainWindow
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
;
#endif // MAINWINDOW_H
MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "widget1.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui->setupUi(this);
MainWindow::~MainWindow()
delete ui;
void MainWindow::on_pushButton_clicked()
Widget1 *w = new Widget1(this);
connect(w, SIGNAL(testSignalWidget1()), this, SLOT(setFocus()));
w->show();
widget1.h
#ifndef WIDGET1_H
#define WIDGET1_H
#include <QWidget>
namespace Ui
class Widget1;
class Widget1 : public QWidget
Q_OBJECT
public:
explicit Widget1(QWidget *parent = 0);
~Widget1();
signals:
void testSignalWidget1();
void testSignalWidget1ToMain();
private slots:
void on_pushButton_clicked();
private:
Ui::Widget1 *ui;
;
#endif // WIDGET1_H
widget1.cpp
#include "widget1.h"
#include "ui_widget1.h"
#include "widget2.h"
Widget1::Widget1(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget1)
ui->setupUi(this);
this->setWindowFlags( Qt::CustomizeWindowHint | Qt::Window );
this->setWindowModality( Qt::WindowModal );
Widget1::~Widget1()
delete ui;
void Widget1::on_pushButton_clicked()
Widget2 *w = new Widget2(this);
connect(w, SIGNAL(testSignalWidget2()),
this, SIGNAL(testSignalWidget1()));
connect(w, SIGNAL(testSignalWidget2()),
this, SLOT(close()));
w->show();
widget2.h
#ifndef WIDGET2_H
#define WIDGET2_H
#include <QWidget>
namespace Ui
class Widget2;
class Widget2 : public QWidget
Q_OBJECT
public:
explicit Widget2(QWidget *parent = 0);
~Widget2();
signals:
void testSignalWidget2();
private slots:
void on_pushButton_clicked();
private:
Ui::Widget2 *ui;
;
#endif // WIDGET2_H
widget2.cpp
#include "widget2.h"
#include "ui_widget2.h"
Widget2::Widget2(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget2)
ui->setupUi(this);
this->setWindowFlags( Qt::CustomizeWindowHint | Qt::Window );
this->setWindowModality( Qt::WindowModal );
Widget2::~Widget2()
delete ui;
void Widget2::on_pushButton_clicked()
emit testSignalWidget2();
this->close();
mainwindow.ui
、widget1.ui
和 widget2.ui
各有一个按钮,它们连接到各自的 on_pushButton_clicked()
功能。
【问题讨论】:
你可以使用setFocus
方法。
@SaZ 我添加了另一个连接语句将testSignalWidget1()
信号连接到setFocus
的MainWindow
,但它没有影响任何东西。
你现在什么也没做。没有代码,您可以在其中发出 testSignalWidget1
。另一个问题是:为什么你在on_pushButton_clicked
里面做connect
?
请向 SSCCE 提供您的问题。
@SaZ 当Widget2
发出testSignalWidget2()
时,它通过connect()
复制到Widget1
,然后发出testSignalWidget1()
。
【参考方案1】:
我通过执行以下操作解决了我的问题:
-
去掉
Widget2
的SIGNAL
和Widget1
的close()
函数的连接。
将该连接替换为Widget1
的本地插槽。
使用QTimer::singleshot()
调用Widget1
的close()
函数。
widget1.h
#ifndef WIDGET1_H
#define WIDGET1_H
#include <QWidget>
namespace Ui
class Widget1;
class Widget1 : public QWidget
Q_OBJECT
public:
explicit Widget1(QWidget *parent = 0);
~Widget1();
signals:
void testSignalWidget1();
private slots:
void on_pushButton_clicked();
void testSlot();
private:
Ui::Widget1 *ui;
;
#endif // WIDGET1_H
widget1.cpp
#include "widget1.h"
#include "ui_widget1.h"
#include "widget2.h"
#include <QTimer>
Widget1::Widget1(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget1)
ui->setupUi(this);
this->setWindowFlags( Qt::CustomizeWindowHint | Qt::Window );
this->setWindowModality( Qt::WindowModal );
Widget1::~Widget1()
delete ui;
void Widget1::on_pushButton_clicked()
Widget2 *w = new Widget2(this);
connect(w, SIGNAL(testSignalWidget2()),
this, SIGNAL(testSignalWidget1()));
// connect(w, SIGNAL(testSignalWidget2()),
// this, SLOT(close()));
connect(w, SIGNAL(testSignalWidget2()),
this, SLOT(testSlot()));
w->show();
void Widget1::testSlot()
QTimer::singleShot(0, this, SLOT(close()));
【讨论】:
以上是关于Qt Window Focusing:关闭二级子窗口时主窗口不聚焦的主要内容,如果未能解决你的问题,请参考以下文章