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

Qt signals/slots do not work [very basic]

本文关键字:非常 工作 信号 Qt      更新时间:2023-10-16

我是Qt的新手,看起来我对这个库的工作方式有一些非常基本的误解。我目前正在阅读m. Schlee写的一本书,但我不想继续,直到我明白如何使这个简单的程序工作。

#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();
}

这个想法是启动两个单独的窗口:一个带有彩色背景,另一个带有改变颜色的按钮(蓝色->黄色->蓝色->…)等等)。它们出现了,但我按下按钮什么也没发生。请帮助。

除了struct是一个类和缺少Q_OBJECT宏之外,代码很好

尝试以下操作:

创建一个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

将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();
}

qmake不能很好地直接在cpp文件中使用Q_OBJECT宏。顺便说一句。