c++ - 该程序(Qt)的信号和插槽问题?

标签 c++ qt

我想链接两个页面,当程序运行并在单击“确定”后显示欢迎页面时,下一页出现。 这是我的代码,但我不知道为什么会出错!!!!有什么问题?

欢迎.h:

    #ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QPushButton>

class welcome : public QWidget
{
    Q_OBJECT


public:
    welcome(QWidget *parent = 0);
    QLabel *wel;
    QPushButton *ok;

public slots:
    void open();
};



#endif // WIDGET_H

欢迎.cpp:

#include "welcome.h"
#include "login.h"

welcome::welcome(QWidget *parent)
    : QWidget(parent)
{
    this->setWindowTitle("Welcome");
    this->resize(250,120);
    wel = new QLabel("Welcome to your program",this);
    wel->setGeometry(65,30,150,20);
    ok = new QPushButton("Ok",this);
    ok->setGeometry(95,70,60,23);
    login w;
    connect(this->ok,SIGNAL(clicked()),w,SLOT(open()));
}
void welcome :: open()
{
    login w;
    w.show();
}

登录.h:

#ifndef LOGIN_H
#define LOGIN_H

#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QCheckBox>
#include <QPushButton>

class login : public QWidget
{
    Q_OBJECT

public:
    login(QWidget *parent = 0);
    QLabel *user,*pass;
    QLineEdit *inuser,*inpass;
    QCheckBox *showpass;
    QPushButton *ok,*reg;
};



#endif // LOGIN_H

登录.cpp:

#include "login.h"

login::login(QWidget *parent)
    : QWidget(parent)
{
    this->setWindowTitle("Login");
    this->resize(300,150);
    user = new QLabel("insert your username :",this);
    user->setGeometry(10,20,120,20);
    pass = new QLabel("insert your password :",this);
    pass->setGeometry(10,50,120,20);
    inuser = new QLineEdit(this);
    inuser->setGeometry(130,20,150,20);
    inpass = new QLineEdit(this);
    inpass->setGeometry(130,50,150,20);
    showpass = new QCheckBox("show password",this);
    showpass->setGeometry(130,80,100,15);
    ok = new QPushButton("login",this);
    ok->setGeometry(125,110,50,25);
    reg = new QPushButton("register",this);
    reg->setGeometry(180,110,50,25);
}

最佳答案

connect 需要一个指针(指向 QObject)而不是一个对象,这就是您看到错误消息的原因。正如 Valeri Atamaniouk 所提到的,您提供 w 本地存储持续时间这一事实也是致命的。您需要使 w 成为 welcome 的成员并在堆上声明它。还要注意析构函数的添加:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QPushButton>

#include "login.h"

class welcome : public QWidget
{
    Q_OBJECT


public:
    welcome(QWidget *parent = 0);
    ~welcome();
    QLabel *wel;
    QPushButton *ok;

public slots:
    void open();

private:
   login* w;
};

#endif //WIDGET_H

欢迎.cpp:

#include "welcome.h"

welcome::welcome(QWidget *parent)
    : QWidget(parent), w(new login)
{
    this->setWindowTitle("Welcome");
    this->resize(250,120);
    wel = new QLabel("Welcome to your program",this);
    wel->setGeometry(65,30,150,20);
    ok = new QPushButton("Ok",this);
    ok->setGeometry(95,70,60,23);
    connect(this->ok,SIGNAL(clicked()),w,SLOT(open()));
}
welcome::~welcome()
{
   delete w;
}
void welcome :: open()
{
    w->show();
}

关于c++ - 该程序(Qt)的信号和插槽问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16615694/

相关文章:

c++ - 是否可以在Windows 8环境下运行在Visual Studio 2005上编译的VC++、Win32应用程序?

qt - 从 QHeaderView saveState/restoreState 中排除移动的列顺序

c++ - 在 Qt 中将文件保存到网络

c++ - 部分模板特化,使用模板化类型(嵌套模板类)

c++ - Brace-init-list 和赋值

c++ - 全新安装的子弹物理引擎无法正确链接?

qt - 如何最小化 Qt 应用程序的大小?

python - QPropertyAnimation 不适用于子部件

qt - 如何禁用 QTextEdit 中的快捷方式

c++ - C++ 函数返回错误值