假设我有一个主窗口。
然后当我点击一个按钮时,我希望打开一个子窗口,并隐藏主窗口。 然后,当我关闭那个子窗口时,我希望主窗口重新出现。
现在我正在打开那个子窗口:
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做过对话。我刚刚添加了布局和按钮等。
答案 0 :(得分:1)
当您在signUpWindow
内loginWindow
设置this
作为父级时创建parentWidget()
。在这种情况下,您可以在signUpWindow
内拨打hide()
并致电signUpWindow
,当您关闭parentWidget()
时,再次拨打show().
并致电{{ 1}}仅当signUpWindow
的父级为loginWindow
时才有效。
在您的代码中,父级为NULL
,但当父级为this
时,它会起作用。
但您的signUpWindow
应为dialog
或:
如果signUpWindow
是widget
,那么当您设置父级时,signUpWindow
会显示在父级上,但QDialog
会显示在单独的窗口中。如果您使用QDialog
子类,则将其设置为父级并使用我的解决方案,但如果您使用QWidget
子类,则将NULL
设置为父级,并且您无法使用{{1} }关系,所以你应该使用信号和插槽(从parent-child
捕获信号并显示或隐藏你的signUpWindow
)。做出选择,但请注意loginWindow
更适合此任务。
另外,我建议您使用QDialog
确保在用户点击closeEvent
时可以关闭。
我写了这个对话框,我测试了它,工作正常:
部首:
close button
.cpp的:
#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
用法(在mainWindow内):
//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();
关系。
按照您的意愿工作,非常简单,只需添加几行代码即可。
答案 1 :(得分:1)
有人还能解释为什么我们在标题中将parent设置为NULL吗?
您不必将父级设置为NULL,如果没有传递,则为父级提供默认值。这样做是为了避免在没有父对象的情况下为创建对象的情况设置额外的构造函数,并且它的工作方式相同,只是省略了传递父对象,而是使用了默认的NULL。
你必须使用QWidget
吗?请记住,这个模块不再在Qt中积极开发,并且几乎只是为了向后兼容。 Qt GUI现在专注于QtQuick,它更快,更容易使用。
QtQuick甚至提供了一个准备好使用的StackView
组件,它正是这样做的,将一个新组件(QML的小部件)放在隐藏的父级之上,直到你弹出新窗口为止,父窗口再次出现,它在显示和隐藏组件时甚至有一些时髦的动画。
此外,QtQuick提供的QtQuick Controls实现为平台本机,因此它们看起来与基于QWidget
的旧组件看起来相同。
为了让您了解使用QtQuick是多么简单,这里有一个简短的例子。它将显示一个随机颜色的对话框,其中包含文本,说明它是哪个级别,另外两个按钮 - 一个用于在其上创建另一个对话框,另一个用于关闭该对话框,如果它是第一个对话框,则显示应用程序:
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)
}