如何修复QObject :: connect:没有这样的插槽..将发送方连接到同一个类中的插槽时

时间:2019-06-30 13:31:59

标签: c++ qt qt5

我正在编写一个程序,该程序创建一个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感谢您的帮助。你给了我动力去保持糊涂状态。

1 个答案:

答案 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} }。