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。

Widget1Widget2 都使用以下代码来设置它们的窗口标志和模式:

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 应用程序开始的。 Widget1Widget2 都自动生成为 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.uiwidget1.uiwidget2.ui 各有一个按钮,它们连接到各自的 on_pushButton_clicked() 功能。

【问题讨论】:

你可以使用setFocus方法。 @SaZ 我添加了另一个连接语句将testSignalWidget1() 信号连接到setFocusMainWindow,但它没有影响任何东西。 你现在什么也没做。没有代码,您可以在其中发出 testSignalWidget1。另一个问题是:为什么你在on_pushButton_clicked 里面做connect 请向 SSCCE 提供您的问题。 @SaZ 当Widget2 发出testSignalWidget2() 时,它通过connect() 复制到Widget1,然后发出testSignalWidget1() 【参考方案1】:

我通过执行以下操作解决了我的问题:

    去掉Widget2SIGNALWidget1close()函数的连接。 将该连接替换为Widget1 的本地插槽。 使用QTimer::singleshot() 调用Widget1close() 函数。

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:关闭二级子窗口时主窗口不聚焦的主要内容,如果未能解决你的问题,请参考以下文章

QT中窗口的排列顺序

QT之二级菜单(二级菜单的箭头可以使用QSS设置图片)

HTML中如何让窗口在点击按钮关闭该窗口?

ASP.NET如何点击按钮后关闭当前窗口?

qt多次调用函数显示多张图片

vb2013 已获得主窗口句柄,怎么遍历所有子窗句柄到TreeView中?