This question already has answers here:
C++ Qt signal and slot not firing
(3个答案)
5年前关闭。
我对Qt非常陌生,对于这个库的工作方式,我似乎有一些非常基本的误解。我目前正在看m的书。 Schlee,但在我了解如何使这个简单的程序起作用之前,我不想继续。
这个想法是要启动2个独立的窗口:一个带有绘制背景的窗口,另一个带有更改颜色的按钮(蓝色->黄色->蓝色-> ..等)。
它们出现了,但是如果我按下按钮,什么也不会发生。请帮忙。
将您的main.cpp更改为以下内容:
直接在cpp文件中,qmake与Q_OBJECT宏不能很好地配合使用。顺便说一句。应用更改后运行qmake。
(3个答案)
5年前关闭。
我对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个独立的窗口:一个带有绘制背景的窗口,另一个带有更改颜色的按钮(蓝色->黄色->蓝色-> ..等)。
它们出现了,但是如果我按下按钮,什么也不会发生。请帮忙。
最佳答案
除了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();
}
直接在cpp文件中,qmake与Q_OBJECT宏不能很好地配合使用。顺便说一句。应用更改后运行qmake。
关于c++ - Qt信号/插槽不起作用[非常基本] ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22526141/