Qt 5 führte eine neue Signal-Slot-Syntax mit Zeigern auf Mitgliedsfunktionen ein, um die Lesbarkeit und Erweiterbarkeit zu verbessern. Bei der Verbindung mit überlasteten Signalen stellte es jedoch Herausforderungen dar.
Beim Versuch, Code mit der neuen Syntax zu aktualisieren, von:
QObject::connect(spinBox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int));
bis:
QObject::connect(spinBox, &QSpinBox::valueChanged, slider, &QSlider::setValue);
Kompilierungsfehler sind aufgrund ungelöster Probleme mit überlasteten Funktionen aufgetreten.
Das Problem ergibt sich aus der Existenz zweier überlasteter Signale namens QSpinBox::valueChanged(int) und QSpinBox::valueChanged(QString). Qt bietet Hilfsfunktionen, um diese Überlastung zu beheben.
Für Qt 5.7 und höher:
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
Für Qt 5.6 und früher:
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
Dieses explizite Casting ist zwar umständlich, aber notwendig, um das gewünschte Signal zu spezifizieren. Es wird dringend empfohlen, eine Überlastung von Signalen und Slots zu vermeiden.
C 11 Workaround:
template<typename... Args> struct SELECT { template<typename C, typename R> static constexpr auto OVERLOAD_OF( R (C::*pmf)(Args...) ) -> decltype(pmf) { return pmf; } };
connect(spinbox, SELECT<int>::OVERLOAD_OF(&QSpinBox::valueChanged), ...)
Qt 5.7 Hilfsfunktionen:
qOverload<>(&Foo:overloadedFunction) qOverload<int, QString>(&Foo:overloadedFunction)
Konsultieren Sie die Qt-Dokumentation für die neuesten Informationen zum Umgang mit überlasteten Signalen und Slots.
Das obige ist der detaillierte Inhalt vonWie löst man überlastete Signal-Slot-Verbindungen in Qt 5?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!