【发布时间】:2018-02-16 08:11:21
【问题描述】:
我“不小心”将信号连接到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)
文档没有提到这一点。
【问题讨论】:
-
一个相应的问题是:当你从一个不是信号的函数连接时会发生什么?答案是它在执行过程中编译并生成警告:“Qobject::connect signal not found in ...”。
-
@HansOlsson ... 并且 QObject::connect() 返回 false。这是我在尝试通过函数指针连接到常规函数时所期望的。
标签: c++ qt signals-slots qwidget moc