我可以在Qt中使用全局广告位吗?
我正在尝试使用此代码,但似乎它不起作用。
slots void f(int i);
void connect(QSpinBox *spinBox)
{
QObject::connect(spinBox, SIGNAL(valueChanged(int)), NULL, SLOT(f(int)));
}
void f(int i)
{
// ...
}
答案 0 :(得分:2)
评论中已经指出:没有全球插槽。
另一方面,由于Qt5,您可以将任何方法连接到信号,即使它没有被标记为插槽。您甚至可以将全局函数和lambda连接到信号。所以,如果要求" SLOT"被删除(并被称为,可能是,"信号处理程序"相反)它可能提供你(可能)要求的东西。
示例代码testQSpinBox.cc
:
// Qt header:
#include <QtWidgets>
// function with matching signature
void f(int value)
{
qDebug() << value;
}
// function with non-matching signature
void g(const char *text, int value)
{
qDebug() << text << value;
}
int main(int argc, char **argv)
{
qDebug() << "Version:" << QT_VERSION_STR;
// main application
QApplication app(argc, argv);
qDebug() << QApplication::style()->objectName();
// setup GUI
QWidget qWin;
QVBoxLayout qBox;
QSpinBox qSpinBox1;
qBox.addWidget(&qSpinBox1);
QSpinBox qSpinBox2;
qBox.addWidget(&qSpinBox2);
QSpinBox qSpinBox3;
qBox.addWidget(&qSpinBox3);
qWin.setLayout(&qBox);
qWin.show();
// install signal handlers
// connect f() to qSpinBox1::valueChanged
QObject::connect(&qSpinBox1,
(void (QSpinBox::*)(int))&QSpinBox::valueChanged,
&f);
// connect lambda to qSpinBox2::valueChanged
QObject::connect(&qSpinBox2,
(void (QSpinBox::*)(int))&QSpinBox::valueChanged,
[](int value) { qDebug() << "qSpinBox2:" << value; });
// use lambda as adapter for function g()
QObject::connect(&qSpinBox3,
(void (QSpinBox::*)(int))&QSpinBox::valueChanged,
[](int value) { g("qSpinBox3:", value); });
// run application
return app.exec();
}
要在cygwin中编译,我准备了一个QMake文件testQSpinBox.pro
:
SOURCES = testQSpinBox.cc
QT += widgets
使用g ++编译和测试:
$ qmake-qt5 testQSpinBox.pro
$ make
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQSpinBox.o testQSpinBox.cc
g++ -o testQSpinBox.exe testQSpinBox.o -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread
$ ./testQSpinBox
Version: 5.9.2
"fusion"
(我点击了每个旋转框的向上按钮以强制valueChanged
信号。)
1
qSpinBox2: 1
qSpinBox3: 1
注意:强>
关于QSpinBox::valueChanged()
有一个专长 - 实际上有两个:
void QSpinBox::valueChanged(int i);
void QSpinBox::valueChanged(const QString &text);
因此,如果我们在QObject::connect()
中提供信号,则方法标识符不明确。我们必须提供一个&#34;方法指针转换&#34;解决歧义:
#if 0 // Ambiguity:
QObject::connect(&qSpinBox1, &QSpinBox::valueChanged, &f);
#else // Solve ambinguity:
QObject::connect(&qSpinBox1,
(void(QSpinBox::*)(int))&QSpinBox::valueChanged,
&f);
#endif // 0
具有多个签名的信号是Qt中的少数例外。通常,在Qt 5样式中连接信号时,没有必要使用丑陋的方法指针。
顺便说一下。在我对SO: QPushButton doesn't update when setDown is called的回答中,我编写了支持Qt 4 和 Qt 5的代码。因此,对于与现代Qt 5信号处理程序相对立的老式Qt SLOT,这可能会很有趣。 / p>