首先,对不起,如果标题没有任何意义。
基本上,我有一个主窗口(为了简单起见,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。
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 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.ui
,widget1.ui
和widget2.ui
每个都有一个按钮,它们连接到各自的on_pushButton_clicked()
功能。
答案 0 :(得分:0)
我通过执行以下操作解决了我的问题:
Widget2
SIGNAL
和Widget1
close()
功能的连接。Widget1
的本地广告位。Widget1
致电close()
的{{1}}功能。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