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