首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QMainWindow没有出现

QMainWindow没有出现
EN

Stack Overflow用户
提问于 2014-06-03 16:11:57
回答 2查看 1.6K关注 0票数 1

我做了一个快速的测试程序,它在执行时似乎什么都不提。这是我的代码:

z_lock.h

代码语言:javascript
复制
#ifndef Z_LOCK_H
#define Z_LOCK_H

#include <QtGui>

class z_lock : public QMainWindow
{
Q_OBJECT
public:
    z_lock();
private slots:
    void password_check();
    void quit();
private:
    QStackedWidget *book;
    QWidget *page1;
    QWidget *page2;
    QLineEdit *input;
};
#endif

z_lock.cpp

代码语言:javascript
复制
#include "z_lock.h"

z_lock::z_lock(){
    book = new QStackedWidget;

    //page1
    page1 = new QWidget;
    QLabel *label1 = new QLabel("Enter password.");
    input = new QLineEdit;
    QPushButton *goButton = new QPushButton("Go");

    connect(goButton, SIGNAL(clicked()), this, SLOT(password_check()));

    QHBoxLayout *layout1;
    layout1 -> addWidget(label1);
    layout1 -> addWidget(input);
    layout1 -> addWidget(goButton);
    page1 -> setLayout(layout1);

    //page2
    page2 = new QWidget;
    QLabel *label2 = new QLabel("Welcome, you're in.");
    QVBoxLayout *layout2;
    layout2 -> addWidget(label2);
    page2 -> setLayout(layout2);

    book -> addWidget(page1);
    book -> addWidget(page2);
    setCentralWidget(book);
}

void z_lock::quit(){
    close();
}

void z_lock::password_check(){
    QString guess = input -> text();
    if (guess == "apple"){
        z_lock::book -> setCurrentIndex(1);
    }
}

main.cpp

代码语言:javascript
复制
#include "z_lock.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    z_lock *that;
    that -> show();

    return app.exec();
}

拜托,任何帮助都行。我做过与QMainWindow有关的所有事情的研究,但仍然什么也没有做。这可能是愚蠢的容易解决,我很抱歉,这样一个基本的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-03 16:23:53

你的代码有几个问题..。让我们从最重要的开始:

  • 您正在堆上分配main.cpp中的对象,这本身就是一个问题,但即使这样做,也应该在C++中使用new关键字。
  • 尽管如此,您确实不应该在堆中分配它:部分原因是因为它会泄漏内存,但更重要的是,不需要它。

因此,将这些行替换为:

代码语言:javascript
复制
z_lock *that;
that -> show();

简单地说:

代码语言:javascript
复制
 z_lock that;
 that.show();

对于这里的布局来说,这也是同样的问题:

代码语言:javascript
复制
QHBoxLayout *layout1;
QVBoxLayout *layout2;

请将其改为:

代码语言:javascript
复制
QHBoxLayout *layout1 = new QHBoxLayout;
QVBoxLayout *layout2 = new QVBoxLayout;

此外,您不应该像这样包括整个QtGui模块:

代码语言:javascript
复制
#include <QtGui>

只需包括你最终需要的类。尽管这是在一些Qt 4的书,这是不好的做法。

这个方法在您的代码中也是无用的,因为它除了包装现有的插槽之外什么也不做:

代码语言:javascript
复制
void z_lock::quit(){
    close();
}

此外,您可能希望使用tr()方法来获得其他语言的翻译:

代码语言:javascript
复制
 QLabel *label1 = new QLabel("Enter password.");
票数 0
EN

Stack Overflow用户

发布于 2014-06-03 16:15:32

代码语言:javascript
复制
z_lock *that;
that -> show();

问题是that是一个未初始化的指针。它没有指向要调用方法的有效z_lock实例。

您需要使用z_lock分配和构造一个new实例。

代码语言:javascript
复制
z_lock* that = new z_lock;
that->show();

或者,更简单地说,切换到堆栈分配:

代码语言:javascript
复制
z_lock that;
that.show();

这同样适用于z_lock构造函数中的“布局”变量。

这是一个例子,说明为什么在高警告级别编译并修复警告是个好主意。编译器可以很容易地注意到并指出未初始化变量的无效使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24019969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档