C++ Qt信号/插槽不工作[非常基本]

C++ Qt信号/插槽不工作[非常基本],c++,qt,C++,Qt,我对Qt很陌生,看起来我对这个库的工作原理有一些基本的误解。我现在正在读一本m。但我不想继续,直到我明白如何使这个简单的程序工作 #include <QtWidgets> #include <QApplication> #include <QStackedWidget> #include <QPushButton> #include <QObject> struct wizard : public QObject { QSta

我对Qt很陌生,看起来我对这个库的工作原理有一些基本的误解。我现在正在读一本m。但我不想继续,直到我明白如何使这个简单的程序工作

#include <QtWidgets>
#include <QApplication>
#include <QStackedWidget>
#include <QPushButton>
#include <QObject>

struct wizard : public QObject
{
    QStackedWidget* p;

    wizard(QStackedWidget* pp) : p(pp) { }

public slots:
    void change()
    {
        int to = p->currentIndex();
        if (to == p->count() - 1)
            to = 0;
        else
            ++to;

        emit chIndex(to);
    }

signals:
    void chIndex(int);
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QStackedWidget qsw;
    QPushButton qpb("magic");

    qsw.resize(500, 500);
    qsw.move(500, 300);
    qsw.setWindowTitle("test qsw");

    qpb.move(330, 300);
    qpb.setWindowTitle("test qpb");

    QWidget* pw1 = new QWidget();
    QPalette pal1;
    pal1.setColor(pw1->backgroundRole(), Qt::blue);
    pw1->setPalette(pal1);
    pw1->resize(500, 500);
    pw1->setAutoFillBackground(true);

    QWidget* pw2 = new QWidget();
    QPalette pal2;
    pal2.setColor(pw2->backgroundRole(), Qt::yellow);
    pw2->setPalette(pal2);
    pw2->resize(500, 500);
    pw2->setAutoFillBackground(true);

    qsw.addWidget(pw1);
    qsw.addWidget(pw2);

    wizard stupidity(&qsw);

    QObject::connect(&qpb, SIGNAL(clicked()), &stupidity, SLOT(change()));
    QObject::connect(&stupidity, SIGNAL(chIndex(int)), &qsw, SLOT(setCurrentIndex(int)));

    qpb.show();
    qsw.show();

    return a.exec();
}
#包括
#包括
#包括
#包括
#包括
结构向导:公共QObject
{
QStackedWidget*p;
向导(QStackedWidget*pp):p(pp){}
公众时段:
无效更改()
{
int to=p->currentIndex();
如果(to==p->count()-1)
to=0;
其他的
++到;
发射chIndex(至);
}
信号:
void-chIndex(int);
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QStackedWidget-qsw;
QPushButton qpb(“魔术”);
qsw.resize(500500);
qsw.移动(500300);
qsw.setWindowTitle(“测试qsw”);
qpb.移动(330300);
qpb.setWindowTitle(“测试qpb”);
QWidget*pw1=新的QWidget();
QPalette-pal1;
pal1.setColor(pw1->backgroundRole(),Qt::blue);
pw1->设置调色板(pal1);
pw1->调整大小(500500);
pw1->setAutoFillBackground(真);
QWidget*pw2=新的QWidget();
QPalette-pal2;
pal2.setColor(pw2->backgroundRole(),Qt::yellow);
pw2->设置调色板(pal2);
pw2->调整大小(500500);
pw2->setAutoFillBackground(真);
qsw.addWidget(pw1);
qsw.addWidget(pw2);
巫师愚蠢(qsw);
QObject::connect(&qpb,信号(单击()),&Stumbity,插槽(更改());
QObject::连接(和愚蠢,信号(chIndex(int)),&qsw,插槽(setCurrentIndex(int));
qpb.show();
qsw.show();
返回a.exec();
}
我们的想法是启动两个独立的窗口:一个是带有绘画背景的窗口,另一个是带有改变颜色的按钮(蓝色->黄色->蓝色->等等)。
它们出现了,但如果我按下按钮,什么也不会发生。请提供帮助。

除了struct是一个类和缺少的Q_对象宏之外,代码还可以

请尝试以下操作:

创建包含以下内容的main.h文件:

#ifndef MAIN_H
#define MAIN_H
#include <QObject>
#include <QStackedWidget>

class wizard : public QObject
{
    Q_OBJECT
public:
    QStackedWidget* p;

    wizard(QStackedWidget* pp) : p(pp) { }

public slots:
    void change()
    {
        int to = p->currentIndex();
        if (to == p->count() - 1)
            to = 0;
        else
            ++to;

        emit chIndex(to);
    }

signals:
    void chIndex(int);
};

#endif // MAIN_H
#如果主
#定义主
#包括
#包括
类向导:公共QObject
{
Q_对象
公众:
QStackedWidget*p;
向导(QStackedWidget*pp):p(pp){}
公众时段:
无效更改()
{
int to=p->currentIndex();
如果(to==p->count()-1)
to=0;
其他的
++到;
发射chIndex(至);
}
信号:
void-chIndex(int);
};
#endif//MAIN_H
将main.cpp更改为以下内容:

#include <QtWidgets>
#include <QApplication>
#include <QPushButton>

#include <main.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QStackedWidget qsw;
    QPushButton qpb("magic");

    qsw.resize(500, 500);
    qsw.move(500, 300);
    qsw.setWindowTitle("test qsw");

    qpb.move(330, 300);
    qpb.setWindowTitle("test qpb");

    QWidget* pw1 = new QWidget();
    QPalette pal1;
    pal1.setColor(pw1->backgroundRole(), Qt::blue);
    pw1->setPalette(pal1);
    pw1->resize(500, 500);
    pw1->setAutoFillBackground(true);

    QWidget* pw2 = new QWidget();
    QPalette pal2;
    pal2.setColor(pw2->backgroundRole(), Qt::yellow);
    pw2->setPalette(pal2);
    pw2->resize(500, 500);
    pw2->setAutoFillBackground(true);

    qsw.addWidget(pw1);
    qsw.addWidget(pw2);

    wizard stupidity(&qsw);

    QObject::connect(&qpb, SIGNAL(clicked()), &stupidity, SLOT(change()));
    QObject::connect(&stupidity, SIGNAL(chIndex(int)), &qsw, SLOT(setCurrentIndex(int)));

    qpb.show();
    qsw.show();

    return a.exec();
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QStackedWidget-qsw;
QPushButton qpb(“魔术”);
qsw.resize(500500);
qsw.移动(500300);
qsw.setWindowTitle(“测试qsw”);
qpb.移动(330300);
qpb.setWindowTitle(“测试qpb”);
QWidget*pw1=新的QWidget();
QPalette-pal1;
pal1.setColor(pw1->backgroundRole(),Qt::blue);
pw1->设置调色板(pal1);
pw1->调整大小(500500);
pw1->setAutoFillBackground(真);
QWidget*pw2=新的QWidget();
QPalette-pal2;
pal2.setColor(pw2->backgroundRole(),Qt::yellow);
pw2->设置调色板(pal2);
pw2->调整大小(500500);
pw2->setAutoFillBackground(真);
qsw.addWidget(pw1);
qsw.addWidget(pw2);
巫师愚蠢(qsw);
QObject::connect(&qpb,信号(单击()),&Stumbity,插槽(更改());
QObject::连接(和愚蠢,信号(chIndex(int)),&qsw,插槽(setCurrentIndex(int));
qpb.show();
qsw.show();
返回a.exec();
}

qmake不能很好地直接在cpp文件中使用Q_对象宏。顺便说一句,在应用更改后运行qmake。

它现在可以工作了,谢谢;)