【问题标题】:How to organize a system of parent and child windows that hide their parent. QT如何组织一个隐藏父窗口和子窗口的系统。 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 创建对话框。我只是添加了布局和按钮等。

【问题讨论】:

    标签: c++ qt user-interface


    【解决方案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)
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-01
      • 2013-10-06
      • 2011-02-12
      • 1970-01-01
      • 2016-02-20
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多