我正在编写一个程序,该程序创建一个QLineEdit,该程序仅接受数字,并且在拒绝非数字的输入时应将背景变为任意颜色。如果输入有效,它将再次使背景变白。现在,我需要将QLineEdit的inputRejected事件和textEdited事件分别连接到randomcolor()和white(),但是连接使我很麻烦,而且我不知道如何解决它。
这是我第一次使用连接,并且我在许多论坛上摸索着尝试在那里找到的不同语法。
#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:没有这样的插槽QLineEdit :: randomcolor()
QObject :: connect:没有这样的信号QLineEdit :: && QLineEdit :: textEdited(const QString)
这些是我得到的错误,我不知道该怎么办,因为对于他们来说,这两个都是存在的。可悲的是我无法更好地描述我的问题,因为我不了解更多。
已解决:问题是,我没有单独调用onlynumbers.h和onlynumbers.cpp中的定义和声明。我也不能把std :: rand()%256放在字符串中,我需要分割字符串并用所有数字转换成qstring来包容它。 :D感谢您的帮助。你给了我动力去保持糊涂状态。
答案 0 :(得分:5)
您忘记了Q_OBJECT
的课程。例如:
class OnlyNumbers : QLineEdit {
Q_OBJECT
...
请参阅QObject上的文档:
请注意,对于实现信号,插槽或属性的任何对象,Q_OBJECT宏都是必需的。
没有宏,元编译器将不会生成类中声明的插槽/信号所需的信息。
此外,在添加Q_OBJECT
之后,您应该在项目上重新运行qmake
,因为qmake
实际上在生成文件中生成了对moc
的调用。 Meta-Object Compiler (moc)的文档对此进行了解释:
无论何时运行qmake,它都会解析项目的头文件并生成make规则,以对包含Q_OBJECT宏的那些文件调用moc。
也如注释中所述-SIGNAL/SLOT
宏是基于字符串的旧实现,切换到新的编译时检查连接有很多好处-参见New Signal Slot Syntax和{{3} }。