我正在使用Qt 5和C ++,我想强制我的一些子窗口拥有自己的任务栏条目。现在,我可以创建无内容QWidgets,并在主窗口(QMainWindow)关闭时使用信号槽机制关闭这些窗口。
然而,当我添加越来越多的父母和孩子时,这整个信号槽技术将变得乏味(不是吗?)并且我确信Qt已经具有我可以用于此的功能。我见过this; 主要和辅助Windows 部分讨论了我正在尝试做的事情。它说:
此外,具有父级的QWidget可以成为窗口 设置Qt :: Window标志。取决于窗口管理系统 这种辅助窗户通常堆叠在它们各自的顶部 父窗口,并没有自己的任务栏条目。
我可以看到我需要将我的QWidgets设置为主Windows ,但我不知道如何。
所以我试过了:
// when a QMainWindow's (this) push button is clicked:
QWidget* newWindow = new QWidget(this, Qt::Window);
newWindow->show();
它没有给我我想要的行为。如何将newWindow
设置为主窗口,同时仍将this
作为其父级?
答案 0 :(得分:1)
我现在不在Qt中使用本机方法。但你可以使用它的信号/插槽,它绝对不会给处理器造成严重负担,直到你有至少一千个窗口。为此,您可以实施自己的子父机制。
例如:
handle
}
使用:
class myOwnWidget: public QWidget{
Q_OBJECT
public:
myOwnWidget(myOwnWidget* parent = 0):
QWidget(){
if(parent){
connect(parent,SIGNAL(close()), this,SLOT(deleteLater()));
}
}
void closeEvent(QCloseEvent* e){
emit close();
QWidget::closeEvent(e);
}
signals:
void close();
};
class PrimaryWindow : public myOwnWidget{
PrimaryWindow(myOwnWidget *parent):
myOwnWidget(parent)
{
//your constructor here
}
在代码PrimaryWindow * rootWindows = new PrimaryWindow();
PrimaryWindow * childWin = new PrimaryWindow(rootWindows);
中创建没有Qt-parent,但是对于关闭子窗口,您应该从PrimaryWindow
继承所有窗口。
希望有所帮助。
答案 1 :(得分:0)
基于Konstantin T。和Mike的想法,我已经开发了两个类MyWidget
和MyMainWindow
,它们可以在他们的用于创建子窗口的构造函数,这些子窗口将具有自己的任务栏条目,同时仍充当其父窗口的子窗口(即,在父窗口终止时自动关闭和销毁)。如果需要此类行为,则MyWidget
会替换QWidget
,而MyMainWindow
会替换QMainWindow
。
my_widget.h:
#ifndef MY_WIDGET_H
#define MY_WIDGET_H
#include <QWidget>
#include <QMainWindow>
class MyMainWindow;
class MyWidget : public QWidget{
Q_OBJECT
public:
MyWidget(MyWidget* parent = 0){
if(parent){
connect(parent, SIGNAL(window_closed()),
this, SLOT(close()));
connect(parent, SIGNAL(destroyed(QObject*)),
this, SLOT(deleteLater()));
}
}
MyWidget(MyMainWindow* parent);
void closeEvent(QCloseEvent* event){
emit window_closed();
QWidget::closeEvent(event);
}
signals:
void window_closed();
};
class MyMainWindow : public QMainWindow{
Q_OBJECT
public:
MyMainWindow(MyMainWindow* parent = 0){
if(parent){
connect(parent, SIGNAL(window_closed()),
this, SLOT(close()));
connect(parent, SIGNAL(destroyed(QObject*)),
this, SLOT(deleteLater()));
}
}
MyMainWindow(MyWidget* parent){
connect(parent, SIGNAL(window_closed()),
this, SLOT(close()));
connect(parent, SIGNAL(destroyed(QObject*)),
this, SLOT(deleteLater()));
}
void closeEvent(QCloseEvent* event){
emit window_closed();
QMainWindow::closeEvent(event);
}
signals:
void window_closed();
};
#endif // MY_WIDGET_H
my_widget.cpp:
#include "my_widget.h"
MyWidget::MyWidget(MyMainWindow* parent){
connect(parent, SIGNAL(window_closed()),
this, SLOT(close()));
connect(parent, SIGNAL(destroyed(QObject*)),
this, SLOT(deleteLater()));
}
示例main.cpp:
#include <QApplication>
#include "my_widget.h"
int main(int argc, char* argv){
QApplication a(argc, argv);
MyWidget mw1{new MyWidget};
mw1.setWindowTitle("ctor: MyWidget(MyWidget*)");
mw1.show();
MyMainWindow mmw1{&mw1};
mmw1.setWindowTitle("ctor: MyMainWindow(MyWidget*)");
mmw1.show();
MyMainWindow mmw2{&mmw1};
mmw2.setWindowTitle("ctor: MyMainWindow(MyMainWindow*)");
mmw2.show();
MyWidget mw2{&mmw2};
mw2.setWindowTitle("ctor: MyWidget(MyMainWindow*)");
mw2.show();
return a.exec();
}
所以窗口链是:mw1 -> mmw1 -> mmw2 -> mw2
,其中任何关闭的窗口也将销毁其右侧的所有窗口,链中的所有窗口都将有自己的任务栏条目。
我确信在my_widget.h
中有更优雅的方法来定义构造函数,但作为一个新手,这对我来说是有用的,可以获得我需要的确切行为。我很高兴看到my_widget.h
上有更好的做法。