Qt窗口聚焦:当第二级子窗口关闭时,主窗口不聚焦

时间:2015-02-05 07:36:15

标签: windows qt qt4.7

首先,对不起,如果标题没有任何意义。

基本上,我有一个主窗口(为了简单起见,QMainWindow实例标记为MainWindow),它在某个时刻创建了一个子窗口小部件(QWidget实例,标记为Widget1) (为简单起见,这是通过点击按钮完成的。)

void MainWindow::on_pushButton_clicked()
{
    Widget1 *w = new Widget1(this);
    w->show();
}

Widget1然后在某个时刻创建另一个子窗口小部件(QWidget实例,标记为Widget2,这是一个与Widget1不同的类)(同样,为简单起见,这是点击按钮完成。

Widget1从其子级(SIGNAL)收到Widget2,该子级用于向其父级(MainWindow)发送另一个信号,并自行关闭。< / p>

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后,它向其父级SIGNAL发出Widget1,然后使用其this->close()函数关闭。

void Widget2::on_pushButton_clicked()
{
    emit testSignalWidget2();
    this->close();
}

我的问题是,一旦完成此过程,窗口焦点不在MainWindow中,而是在另一个窗口打开(如果没有打开其他窗口,此过程显示任务栏,即使显示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 Form Class。

的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()功能。

1 个答案:

答案 0 :(得分:0)

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

  1. 删除Widget2 SIGNALWidget1 close()功能的连接。
  2. 将该连接替换为Widget1的本地广告位。
  3. 使用Widget1致电close()的{​​{1}}功能。
  4. widget1.h

    QTimer::singleshot()

    widget1.cpp

    #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