【问题标题】:Qt signals/slots do not work [very basic] [duplicate]Qt信号/插槽不起作用[非常基本] [重复]
【发布时间】:2014-03-20 07:25:10
【问题描述】:

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

我们的想法是启动 2 个单独的窗口:一个带有彩绘背景,另一个带有改变颜色的按钮(蓝色->黄色->蓝色->.. 等)。 它们出现了,但如果我按下按钮,什么也不会发生。请帮忙。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    除了 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 宏。顺便提一句。应用更改后运行 qmake。

    【讨论】:

    • 现在可以使用了,谢谢 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多