我“不小心”将信号连接到QWidget::setToolTip():

bool ok = connect(source, &Source::textSignal, widget, &QWidget::setToolTip);
Q_ASSERT(ok);

...而且有效。连接不仅成功,该函数还被正确调用。

自己尝试:
main.cpp
#include <QApplication>
#include <QLineEdit>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QLineEdit le;
    bool ok = QObject::connect(&le, &QLineEdit::textChanged, &le, &QWidget::setToolTip);
    Q_ASSERT(ok);
    le.show();
    return a.exec();
}
setToolTip()未声明为slot

来自qwidget.h:
    // [...]
public Q_SLOTS: // start of Q_SLOTS
    void setWindowTitle(const QString &);
#ifndef QT_NO_STYLE_STYLESHEET
    void setStyleSheet(const QString& styleSheet);
#endif
public: // from my understanding, this should end the Q_SLOTS region
#ifndef QT_NO_STYLE_STYLESHEET
    QString styleSheet() const;
#endif
    QString windowTitle() const;
    // [...]
    bool isWindowModified() const;
#ifndef QT_NO_TOOLTIP
    void setToolTip(const QString &); // no Q_SLOTS!?
    QString toolTip() const;
    void setToolTipDuration(int msec);
    int toolTipDuration() const;
#endif

所以我想知道:这是因为toolTip被声明为Q_PROPERTY吗?
    Q_PROPERTY(QString toolTip READ toolTip WRITE setToolTip)

该文档没有提及。

最佳答案

我在woboq.com ('Connecting to any function' and preceding)找到了答案:



=> 无需将函数指针声明为public slots:即可调用。

关于c++ - 为什么可以连接到未声明为Q_SLOTS的功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48822547/

10-09 06:38