如何组织一个隐藏父窗口和子窗口的系统。 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
或者:
如果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-child
关系。
随心所欲,非常简单,只需添加几行代码。
【讨论】:
在主窗口中创建对话框是什么意思? @user3247278 signUpWindow 是对话框,你在 mainWindow 中创建它 我为上下文添加了一些额外的代码。但我不知道你所说的 signUpWindow 是对话框是什么意思 @user3247278 发布signUpWindow代码,我想知道你为什么不能设置这个为父母 @user3247278 你的代码很有帮助,我明白为什么这作为父母不起作用,请检查我更新的答案。【参考方案2】:有人能解释一下为什么我们在标题中将 parent 设置为 NULL 吗?
您没有将 parent 设置为 NULL,如果没有传递,则为 parent 提供默认值。这样做是为了避免在创建没有父对象的情况下使用额外的构造函数,并且它的工作方式相同,您只需省略传递父对象,而是使用默认的 NULL。
你必须使用QWidget
s 吗?请记住,该模块不再在 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的主要内容,如果未能解决你的问题,请参考以下文章