如何修复QObject::connect:没有这样的插槽..将发送者连接到同一类中的插槽时[重复]
Posted
技术标签:
【中文标题】如何修复QObject::connect:没有这样的插槽..将发送者连接到同一类中的插槽时[重复]【英文标题】:How to fix QObject::connect: No such slot.. when connecting a sender to a slot both in the same class [duplicate] 【发布时间】:2019-06-30 13:31:59 【问题描述】:我正在编写一个程序,它创建一个只接受数字的 QLineEdit,并且当它拒绝不是数字的输入时,应该将背景变成某种任意颜色。如果输入被接受,它将再次将背景变为白色。现在我需要将 QLineEdit 的 inputRejected 和 textEdited 事件分别连接到 randomcolor() 和 white() ,但是连接给我带来了麻烦,我不知道如何解决它。
这是我第一次使用 connect,我已经在许多论坛中苦苦尝试了我在那里找到的不同语法。
#include <QtWidgets>
class OnlyNumbers : QLineEdit
public:
static int spawn(int argc, char *argv[])
QApplication app(argc, argv);
OnlyNumbers P;
return app.exec();
OnlyNumbers() : QLineEdit()
this->setValidator(new QIntValidator());
QObject::connect(this, SIGNAL(inputRejected()), this, SLOT(randomcolor()));
QObject::connect(this, SIGNAL(&QLineEdit::textEdited(const QString)), this, SLOT(&OnlyNumbers::white()));
QRegExp rx("[0-9]*"); QValidator *validator = new QRegExpValidator(rx, this);
this->setValidator(validator);
this->show();
public slots:
void randomcolor()
this->setStyleSheet("QLineEdit background: rgb(std::rand()%256, rand()%256, rand()%256); selection-background-color: rgb(rand()%256, rand()%256, rand()%256); ");
void white()
this->setStyleSheet("QLineEdit background: rgb(255, 255, 255); selection-background-color: rgb(233, 99, 0); ");
;
int main(int argc, char *argv[])
return OnlyNumbers::spawn(argc, argv);
QObject::connect: No such slot QLineEdit::randomcolor()
QObject::connect: 没有这样的信号 QLineEdit::&QLineEdit::textEdited(const QString)
这些是我得到的错误,我不知道如何处理它们,因为对于他们来说,这两个是存在的。遗憾的是,我无法更好地描述我的问题,因为我不知道更多。
已解决:问题是,我没有在 onlynumbers.h 和 onlynumbers.cpp 中单独调用定义和声明。此外,我不能将 std::rand()%256 放入字符串中,我需要拆分字符串并将其与所有转换为 qstring 的数字连接起来。 :D 感谢您的帮助。你给了我继续谷歌搜索的动力。
【问题讨论】:
用QObject::connect(this, SIGNAL(textEdited(const QString)), this, SLOT(white()));
替换QObject::connect(this, SIGNAL(&QLineEdit::textEdited(const QString)), this, SLOT(&OnlyNumbers::white()));
你似乎在混合Qt4 和Qt5 连接方法。
您真的不应该再将旧的基于字符串的信号/插槽连接语法与SIGNAL
和SLOT
宏一起使用。最好使用新的 - compile time checked, pointer to member function based syntax。它既安全又快捷。
你也可以使用Qt5语法QObject::connect(this, &QLineEdit::textEdited, this,&OnlyNumbers::white);
【参考方案1】:
您的班级忘记了Q_OBJECT
。例如:
class OnlyNumbers : QLineEdit
Q_OBJECT
...
请参阅QObject 上的文档:
请注意,对于任何实现信号、槽或属性的对象,Q_OBJECT 宏都是必需的。
没有宏,元编译器根本不会生成类中声明的插槽/信号所需的信息。
另外,在添加Q_OBJECT
之后,您应该在您的项目上重新运行qmake
,因为qmake
实际上会在makefile 中生成对moc
的调用。 Meta-Object Compiler (moc) 的文档对此进行了解释:
每当运行 qmake 时,它都会解析项目的头文件并生成 make 规则,以便为那些包含 Q_OBJECT 宏的文件调用 moc。
同样如 cmets 中所述 - SIGNAL/SLOT
宏是旧的基于字符串的实现,切换到新的编译时检查连接有很多好处 - 请参阅 New Signal Slot Syntax 和 Differences between String-Based and Functor-Based Connections。
【讨论】:
使用新的编译时检查语法,插槽不再需要Q_OBJECT
。仅适用于信号。
添加 Q_OBJECT 后,我得到未定义的对 `vtable for OnlyNumbers' 和 collect2.exe:-1: Fehler: error: ld 返回 1 个退出状态的引用。它读到这个错误来自我的编译器,所以我把代码给我的一个朋友来测试,因为我不明白我应该如何处理这个错误
这意味着 moc
在更改后没有运行。您可能需要运行 QMake
或重新生成项目,具体取决于您的构建方式。
是的,请添加信号/插槽问题的修复程序。这个答案没有解决问题的主要问题。以上是关于如何修复QObject::connect:没有这样的插槽..将发送者连接到同一类中的插槽时[重复]的主要内容,如果未能解决你的问题,请参考以下文章
QObject::connect: 没有这样的信号progressbarV::keyReleaseEvent()
QObject::connect: 没有这样的信号错误 C++
QObject::connect: 没有这样的信号运行时警告 - 找不到原因