Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
struct xxx
{
QDialog* dlg;
xxx(QDialog* _dlg) : dlg(_dlg) {}
operator()(int result)
{
...
}
};
void SomeClass::Foo(const char *slot) {
...
QAction *action = new QAction(...);
connect(action, SIGNAL(triggered()), this, slot);
...
}
class Test : public QObject
{ Q_OBJECT
public:
Test() {
connect(this, &Test::someSignal, this, &Test::someSlot);
}
signals:
void someSignal(const QString &);
public:
void someSlot();
};
QTcpSocket *socket = new QTcpSocket;
...
QObject::connect(socket, static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)>(&QAbstractSocket::error), [socket] (QAbstractSocket::SocketError) {
qDebug()<< "ERROR " << socket->errorString();
socket->deleteLater();
});
As you might see in the example, connecting to QAbstractSocket::error is not really beautiful since error has an overload, and taking the address of an overloaded function requires explicit casting.
Some macro could help (with c++0x or typeof extensions)
The best thing is probably to recommend not to overload signals or slots …
… but we have been adding overloads in past minor releases of Qt because taking the address of a function was not a use case we support. But now this would be impossible without breaking the source compatibility.
Some macro could help
connect(testObject1, &TestClass1::someSignal1, testObject2, &TestClass2::someSlot1);
писать connect(testObject1, someSignal1, testObject2, someSlot1);
с сохранением проверки на этапе компиляции и прочих плюшек.template<typename T>
struct decltype_t
{
typedef T type;
};
#define DECLTYPE(expr) decltype_t<decltype(expr)>::type
template <class T>
void _invoke(T & obj, void (T::*method)())
{
(obj.*method)();
}
#define invoke(obj, method) (_invoke((obj), &DECLTYPE(obj)::method))
class TestClass
{
public:
void someSlot() { cout << "TestClass::someSlot invoked" << endl; }
};
int main()
{
TestClass test;
_invoke(test, &TestClass::someSlot);
invoke(test, someSlot);
return 0;
}
Сигналы и слоты в Qt5