Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这个程序(Qt)的信号和插槽问题?_C++_Qt - Fatal编程技术网

C++ 这个程序(Qt)的信号和插槽问题?

C++ 这个程序(Qt)的信号和插槽问题?,c++,qt,C++,Qt,我想链接两个页面,当程序运行和欢迎页面显示后,点击“确定”下一页来。 这是我的代码,但我不知道为什么它会出错!!!!有什么问题 欢迎。h: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QLabel> #include <QPushButton> class welcome : public QWidget { Q_OBJECT public: we

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

欢迎。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
login.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

您的
w
是作用域局部变量,并在连接到它之后立即删除。使其特定于实例。

w
是作用域局部变量,并在您
连接到它之后立即删除。使其特定于实例。

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

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


对不起,我的水晶球正在修理中,所以你得告诉我们。错误是什么?调用“welcome::connect(QPushButton*&,const char*,login&,const char*)”时没有匹配的函数好的,您应该将连接也放在
这个
上(因为welcome持有打开的函数)。我以这种方式更改了连接行:“connect(ok,SIGNAL(clicked()),&w,SLOT(open());”没有给出错误,但当我单击“ok”时按钮未发生任何情况???无法识别插槽!为什么?@Casillass Real:Najzero的意思是
connect(确定,信号(点击()),这个,插槽(打开())这个
上(因为welcome持有打开的函数)。我以这种方式更改了连接行:“connect(ok,SIGNAL(clicked()),&w,SLOT(open());”没有给出错误,但当我单击“ok”时按钮未发生任何情况???无法识别插槽!为什么?@Casillass Real:Najzero的意思是
connect(确定,信号(点击()),这个,插槽(打开())@CasillassReal那么发生了什么事?如果QPushButton只是向前声明的,它将不起作用。确保#include在那里。@FrankOsterfeld编辑Make
welcome.h
按照您所关心的内容完成。@CasillassReal还有一点头球护卫的问题,它们应该有类的名称——确保代码中没有另一个以
\ifndef WIDGET\u h
@CasillassReal开头的
'h
文件——自从你上次发表评论以来,我编辑了这些文件——你试过那个版本吗?只有在未将“login.h”
包含在
welcome.h
@CasillassReal中的情况下,您才会出现此错误。那么发生了什么?如果QPushButton只是向前声明,它将不起作用。确保#include在那里。@FrankOsterfeld编辑Make
welcome.h
按照您所关心的内容完成。@CasillassReal还有一点头球护卫的问题,它们应该有类的名称——确保代码中没有另一个以
\ifndef WIDGET\u h
@CasillassReal开头的
'h
文件——自从你上次发表评论以来,我编辑了这些文件——你试过那个版本吗?只有在未在
welcome.h
中包含“login.h”
的情况下,您才会出现此错误
#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
#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();
}