我“不小心”将信号连接到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/