如何组织一个隐藏父窗口和子窗口的系统。 QT

Posted

技术标签:

【中文标题】如何组织一个隐藏父窗口和子窗口的系统。 QT【英文标题】:How to organize a system of parent and child windows that hide their parent. QT 【发布时间】:2014-11-08 09:58:40 【问题描述】:

假设我有一个主窗口。

然后,当我单击一个按钮时,我希望打开一个子窗口并隐藏主窗口。 然后,当我关闭该子窗口时,我希望主窗口重新出现。

现在我正在通过以下方式打开那个子窗口:

s=new SignUpWindow(NULL,temp);
s->show();

其中 s 是我的主窗口的私有指针。

当我尝试这样做时:

s=new SignUpWindow(this,temp);
s->show();

s 窗口不显示。

这是它的构造函数在它的头部的签名:

SignUpWindow (QWidget* parent=NULL, Netflix *n=NULL);

有人能解释一下为什么我们在标题中将 parent 设置为 NULL 吗? 当我尝试使用它的参数并得到如下错误时,我有时会遇到问题:

候选人期望 1 个参数,2 个提供 qt

感谢您的所有帮助 -一个疲倦的大学生刚刚学习qt

更新 以下基本上是我的主窗口的标题:

class LoginWindow : public QWidget


    Q_OBJECT

    public:
        LoginWindow (QWidget* parent=NULL, Netflix *n=NULL);

    public slots:
        void loggedIn();
        void newUser();
        void quitPushed();


    private:
        QPushButton *quitButton, *loginButton, *newUserButton;
        QLineEdit *login;//this is the text area that takes in the loginID    
;

#endif

然后有一个功能是通过单击打开一个新窗口的按钮来启动的:

void LoginWindow::newUser()

        s=new SignUpWindow(NULL,temp);
        s->show();
        //this->hide();

如何将 s 连接到 LogInWindow?

更新 2 SignUpWINdow.h:

class SignUpWindow : public QWidget


    Q_OBJECT

    public:
        SignUpWindow (QWidget* parent=NULL, Netflix *n=NULL);


    public slots:

    private:
 ;

SignUpWindow.cpp:

SignUpWindow::SignUpWindow (QWidget* parent, Netflix *n) : QWidget (parent)

    QVBoxLayout *mainLayout = new QVBoxLayout;
    //then i add things like buttons and group boxes and etc but no dialogs...

我从未为我的 SignUpWindow 创建对话框。我只是添加了布局和按钮等。

【问题讨论】:

【参考方案1】:

当您在loginWindow 中创建signUpWindow 时,将this 设置为父级。在这种情况下,您将能够在signUpWindow 中调用parentWidget() 并调用hide(),当您关闭signUpWindow 时,再次调用parentWidget() 并调用show(). 它仅在@987654330 的父级时有效@ 是loginWindow

在您的代码中,父级是 NULL,但当父级是 this 时它可以工作。

但是你的signUpWindow 应该是dialog 或者:

如果signUpWindowwidget,那么当您设置父级时,您的signUpWindow 会出现在父级上,但QDialog 会出现在单独的窗口中。如果您使用QDialog 子类,则将其设置为父类并使用我的解决方案,但是如果您使用QWidget 子类,则将NULL 设置为父类并且不能使用parent-child 关系,因此您应该使用信号和插槽(捕捉来自signUpWindow 的信号并显示或隐藏您的loginWindow)。请自行选择,但请注意QDialog 更适合此任务。

另外我建议您使用closeEvent 以确保您可以在用户点击close button 时捕捉到关闭。

我编写了这个对话框并对其进行了测试,效果很好:

标题:

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QCloseEvent>

namespace Ui 
class Dialog;


class Dialog : public QDialog

    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);

    ~Dialog();

protected:

    void closeEvent(QCloseEvent *);

private:
    Ui::Dialog *ui;


;

#endif // DIALOG_H

Cpp:

//constructor
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)

    ui->setupUi(this);

    parentWidget()->hide();


//closeEvent
void Dialog::closeEvent(QCloseEvent *)

    parentWidget()->show();

用法(在主窗口内):

Dialog *mDialog = new Dialog(this);
mDialog->show();

如您所见,我设置了父级,但对话框显示为单独的窗口,您仍然可以使用parent-child 关系。

随心所欲,非常简单,只需添加几行代码。

【讨论】:

在主窗口中创建对话框是什么意思? @user3247278 signUpWindow 是对话框,你在 mainWindow 中创建它 我为上下文添加了一些额外的代码。但我不知道你所说的 signUpWindow 是对话框是什么意思 @user3247278 发布signUpWindow代码,我想知道你为什么不能设置这个为父母 @user3247278 你的代码很有帮助,我明白为什么这作为父母不起作用,请检查我更新的答案。【参考方案2】:

有人能解释一下为什么我们在标题中将 parent 设置为 NULL 吗?

您没有将 parent 设置为 NULL,如果没有传递,则为 parent 提供默认值。这样做是为了避免在创建没有父对象的情况下使用额外的构造函数,并且它的工作方式相同,您只需省略传递父对象,而是使用默认的 NULL。


你必须使用QWidgets 吗?请记住,该模块不再在 Qt 中积极开发,并且几乎只是为了向后兼容。 Qt GUI 现在专注于 QtQuick,它更快更容易使用。

QtQuick 甚至提供了一个随时可用的StackView 组件,它就是这样做的,将一个新组件(QML 的小部件)放在隐藏的父级之上,直到您弹出新窗口,此时父窗口出现同样,它在显示和隐藏组件时甚至还有一些时髦的动画。

QtQuick 还提供了QtQuick Controls,它们被实现为看起来是平台原生的,因此它们看起来与旧的基于QWidget 的组件的外观相同。

只是为了让您了解使用 QtQuick 的简单程度,这里有一个简短的示例。它将显示一个随机颜色的对话框,其中包含说明它所在级别的文本和 2 个按钮 - 一个用于在其上创建另一个对话框,另一个用于关闭该对话框或应用程序(如果它是第一个对话框):

ApplicationWindow 
    visible: true
    width: 200
    height: 200

    function randomColor()  return Qt.lighter(Qt.rgba(Math.random(),Math.random(), Math.random(), 1))

    StackView 
        id: stack
    

    Component 
        id: dialog

        Rectangle 
            color: randomColor()
            Column 
                Text 
                    text: "We are on level " + stack.depth
                
                Row 
                    Button 
                        text: "Snow Another"
                        onClicked: stack.push(dialog)
                    
                    Button 
                        text: "Close"
                        onClicked: 
                            if (stack.depth != 1) stack.pop()
                            else Qt.quit()
                        
                    
                
            
        
    

    Component.onCompleted: stack.push(dialog)

【讨论】:

以上是关于如何组织一个隐藏父窗口和子窗口的系统。 QT的主要内容,如果未能解决你的问题,请参考以下文章

关于Qt子窗口和父窗口的问题

qt把子窗口放进父窗口的widget里

PyQt5从子窗口关闭父窗口和子窗口

Qt学习笔记2.窗体Widget && 屏幕坐标 && 布局

如何在 Qt 中将消息从子窗口小部件发送到父窗口?

QT中父窗口响应子窗口动作