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

4

假设我有一个主窗口。

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

目前,我通过以下方式打开该子窗口:

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

这里的s是我的主窗口的一个私有指针。

当我尝试执行以下操作时:

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

窗口未显示。

以下是其头文件中构造函数的签名:

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

有人能解释一下为什么我们在头文件中将parent设置为NULL吗? 当我尝试调整它的参数时,有时会出现如下错误:

candidate expects 1 argument, 2 provided 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...
}

我从未为我的注册窗口创建过对话框。我只是添加了布局和按钮等。

2个回答

2
当您在loginWindow内创建signUpWindow时,请将this设置为父对象。这样,您就可以在signUpWindow中调用parentWidget()并调用hide()。当您关闭signUpWindow时,再次调用parentWidget()并调用show()。仅当signUpWindow的父对象是loginWindow时才起作用。
在您的代码中,父对象是NULL,但当父对象是this时,它会起作用。
但是,您的signUpWindow应该是一个dialog或:
如果signUpWindow是一个widget,则当您设置父对象时,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,但对话框出现为一个单独的窗口,您仍然可以使用parent-child关系。

它可以按您想要的方式工作,并且非常容易,只需添加几行代码即可。


@user3247278,你的代码很有帮助,我明白了为什么这个父级元素不起作用,麻烦请检查一下我的更新答案。 - Jablonski
@user3247278,我看到这可能会给你带来问题。接下来的一个小时我将离线,但之后我会尝试为您提供最简单的解决方案。如果您的代码不是绝密的话,您可以给我完整的signUpWindow,这样我就可以得到更准确的代码。 - Jablonski
非常感谢你,Cherynobyl!!我终于搞定了。现在我只需要制作它的布局和其他东西。我真的很感激你的帮助! - user3247278
我能否将QPushButton添加到QDialog中? - user3247278
@user3247278 很好。当然可以,可以使用Qt Designer完成此操作,也可以将按钮添加到布局中,QDialog与小部件非常相似。 - Jablonski
显示剩余9条评论

2
“为什么在头文件中将父节点设置为NULL?” 你不是将父节点设置为NULL,而是在没有传递父节点时为其提供默认值。这样做是为了避免在创建没有父节点的对象时需要额外的构造函数,并且它的工作方式相同,只需省略传递父节点,而是使用默认的NULL。
你必须使用QWidget吗?请记住,这个模块在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)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接