Qt:强制子窗口有自己的任务栏条目

时间:2016-09-30 13:10:15

标签: c++ qt window parent

我正在使用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作为其父级?

2 个答案:

答案 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的想法,我已经开发了两个类MyWidgetMyMainWindow,它们可以在他们的用于创建子窗口的构造函数,这些子窗口将具有自己的任务栏条目,同时仍充当其父窗口的子窗口(即,在父窗口终止时自动关闭和销毁)。如果需要此类行为,则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上有更好的做法。