【问题标题】:Connect to a SLOT in Qt连接到 Qt 中的 SLOT
【发布时间】:2013-08-05 11:46:45
【问题描述】:

我有一个主窗口,其中有一个按钮,如果按下它会创建一个新窗口。所以它工作正常,我的问题是我在第二个窗口上有另一个按钮。我想把它连接到一个插槽,但总是出错

没有这样的槽 dbManager::addQuestions(QString(question->text()))

这是我要连接的地方

void WindowManager::addQuestionDialog(){
...
    question = new QLineEdit();
    QObject::connect(validBtn,SIGNAL(clicked()), &db, SLOT(addQuestions(QString(question->text()))));
...
}

这就是我要连接的地方(cpp):

bool dbManager::addQuestions(QString& a){
    qDebug()<<"Connection";
    return true ;
}

.h 公共插槽:

   bool addQuestions(QString& a);

【问题讨论】:

    标签: qt


    【解决方案1】:

    问题在于您尝试连接的方式:

    QObject::connect(validBtn,SIGNAL(clicked()), &db,
                     SLOT(addQuestions(QString(question->text()))));
    

    QObject::connect() 试图建立一个连接,它实际上并没有传递任何参数。所以:

    SLOT(addQuestions(QString(question->text())))
    

    格式错误,因为您试图将 question->text() 作为参数传递。你不能那样做。如果您希望插槽接收参数,则应该传递它的信号。所以你需要一个带有 QString 参数的信号。

    有多种方法可以解决这个问题。最简单的方法是创建一个不带任何参数并调用 addQuestions() 的新插槽。例如:

    void WindowManager::onValidBtnClick()
    {
        question = new QLineEdit();
        db.addQuestions(question->text()));
    }
    

    然后你连接到那个:

    void WindowManager::addQuestionDialog()
    {
        // ...
        connect(validBtn, SIGNAL(clicked()), SLOT(onValidBtnClick()));
        // ...
    }
    

    【讨论】:

    • 我怎样才能创建一个信号,它像 clicked() 一样工作并传递参数?
    • @erbal 您可以创建一个调用 addQuestions() 的新插槽。答案已更新。
    • 谢谢! :) 顺便说一句,我真的不明白为什么我不能像这样传递一个 QString:QString(question->text())。它不应该将 question->text() 作为字符串传递吗?
    • @erbal 你的意思是在你的原始代码中吗?正如已经提到的,connect() 没有传递任何东西。你只是在那里写下插槽的签名。 question-&gt;text() 不是 addQuestions() 函数签名的一部分。
    • @erbal 请注意,即使 If clicked() 信号实际上有一个 QString 参数,那么您仍然无法在 connect() 调用中传递任何内容。然后它看起来像这样:connect(validBtn, SIGNAL(clicked(QString)), &amp;db, SLOT(addQuestions(QString)))。当您实际发出信号时,将传递参数的实际数据:emit clicked(someString)
    【解决方案2】:

    我相信一个插槽应该总是返回 void。您的班级中是否还有带有插槽的 Q_OBJECT 宏,并且它是公共的。像这样:

    class Counter : public QObject
    {
        Q_OBJECT
        int m_value;
    public:
        int value() const { return m_value; }
    public slots:
        void setValue(int value);
    

    【讨论】:

    • 插槽不需要返回 void。它们也可以像普通函数一样被调用。例如:qt-project.org/doc/qt-5.1/qtwidgets/qwidget.html#close 此外,您可以很好地连接到私有插槽。如果没有信号/插槽连接,您就无法直接调用它们。
    • 是的,我使用 Q_OBJECT 宏。
    【解决方案3】:

    信号的签名和槽的签名必须匹配才能正确连接它们。 一个有用的调试信号和槽的博客:http://samdutton.wordpress.com/2008/10/03/debugging-signals-and-slots-in-qt/

    From the documentation:

     The signature of a signal must match the signature of the receiving slot. (In fact a slot may have a shorter signature than the signal it receives because it can ignore extra arguments.) Since the signatures are compatible, the compiler can help us detect type mismatches. 
    

    另外请使用新的连接语法。这样你就可以在编译时发现一些错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2021-09-23
      • 1970-01-01
      相关资源
      最近更新 更多