QT:没有这样的插槽-这里的新手
QT : No such slot - Newbie here
#include "mainwindow.h"
#include <QApplication>
#include "QProgressBar"
#include "QPushButton"
#include "QHBoxLayout"
#include "QLabel"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget *mainw = new QWidget;
mainw->setWindowTitle("Progress Increase");
QHBoxLayout *layout = new QHBoxLayout();
QPushButton *button = new QPushButton("PRESS TO INCREASE");
QLabel *newlabel = new QLabel();
newlabel->setText("WILL CHANGE HERE");
QObject::connect(button,SIGNAL(pressed()),newlabel,SLOT(setText("GAMA GAMA")));
layout->addWidget(button);
layout->addWidget(newlabel);
mainw->setLayout(layout);
mainw->show();
return a.exec();
}
QT给出以下错误。我是新手QObject::connect: No such slot QLabel::setText("GAMA GAMA") in. Gaamamain.cpp:18
我建议您查看QObject::connect上的文档。Qt有一个非常好的文档,很容易浏览和理解。
你得到这个错误是因为QObject::connect的参数是-发出信号的物体-发出的信号-接收对象-和接收方法,称为插槽你不能传递参数值给信号和槽,只传递它们的类型。此外,槽接受的参数类型的数目必须等于或少于信号的数目。
例如你的代码QObject::connect(button,SIGNAL(pressed()),newlabel,SLOT(setText("GAMA GAMA")));
应为
QObject::connect(button,SIGNAL(pressed()),newlabel,SLOT(setText()));
,但这又会是错误的,因为没有方法QLable::setext()我想你要找的是
QObject::connect(button,SIGNAL(pressed()),newlabel,SLOT(someSlot()));
然后定义someslot()
,并在其中设置标签的文本为您想要的。
QObject::连接(按钮、信号(按()),newlabel,槽(setText("伽马伽马"));
如果你想为QPushButton::pressed()
事件创建一个处理程序,即在按钮被按下后,标签文本应该被改变,你可以
// Create a halper that transforms pressed() signal to textChanged(text) signal
// that will be connected to setText() slot, i.e.
// button.pressed() -> proxy.onButtonPressed() -> label.setText(text)
//
class SignalHelper : public QObject {
Q_OBJECT
QString text_;
public:
SignalHelper(const QString & text)
: text_(text) {
}
signals:
void textChanged(const QString & text);
public slots:
void onButtonPressed() {
emit textChanged(text_);
}
};
int main(int argc, char *argv[]) {
...
// Connect
//
QScopedPointer<SignalHelper> pHelper(new SignalHelper(QStringLiteral("GAMA GAMA")));
QObject::connect(button, &QPushButton::pressed,
pHelper.data(), &SignalHelper::onButtonPressed);
QObject::connect(pHelper.data(), &SignalHelper::textChanged,
newlabel, &QLabel::setText);
...
// Also you can add another button that sets another text
//
QPushButton *button2 = new QPushButton("PRESS TO DECREASE");
QScopedPointer<SignalHelper> pHelper2(new SignalHelper(QStringLiteral("Decreased")));
QObject::connect(button2, &QPushButton::pressed,
pHelper2.data(), &SignalHelper::onButtonPressed);
QObject::connect(pHelper2.data(), &SignalHelper::textChanged,
newlabel, &QLabel::setText);
...
}
另一种方法是使用信号处理程序+ std::bind()——在这种情况下,您不需要在helper类中定义任何特定的信号,因此您可以将任何处理程序附加到pressed()信号上。
typedef std::function<void()> Handler_t;
class BtnPressHandler : public QObject {
Q_OBJECT
Handler_t handler_;
public:
BtnPressHandler(Handler_t handler)
: handler_(handler) {
}
public slots:
void onButtonPressed() {
handler_();
}
};
// Connect
//
QScopedPointer<BtnPressHandler> pHandler(new BtnPressHandler(
std::bind(&QLabel::setText, newlabel, QStringLiteral("GAMA GAMA"))));
QObject::connect(button, &QPushButton::pressed,
pHandler.data(), &BtnPressHandler::onButtonPressed);
// Create a button that closes an application
//
QPushButton * exitBtn = new QPushButton("PRESS TO EXIT");
QScopedPointer<BtnPressHandler> pHandler2(new BtnPressHandler(
std::bind(&QApplication::quit, &a)));
QObject::connect(exitBtn, &QPushButton::pressed,
pHandler2.data(), &BtnPressHandler::onButtonPressed);
相关文章:
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 从Q_INVOKABLE功能或插槽中更改QQuick图像源
- 升压信号2将插槽传递到成员功能以断开连接
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- C++ 信号和插槽不工作:插槽不响应事件
- NS3 插槽混淆(需要帮助理解)
- QObject::连接无法将信号连接到*this*对象的插槽
- QT 插槽未在主线程上调用
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 控制带有信号/插槽的Qt QML滑动视图
- Qt 信号/插槽问题
- QT5 信号不会激活插槽内的功能
- Qt5:连接:如果插槽的参数少于信号,如何使用"连接"
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- Qt插槽调用了两次
- C++Qt信号和插槽
- 从插槽调用 QApplication::p rocessEvents 会导致再次调用同一插槽
- QT:没有这样的插槽-这里的新手