Heim > Backend-Entwicklung > C++ > Wie löst man überlastete Signal-Slot-Verbindungen in Qt 5?

Wie löst man überlastete Signal-Slot-Verbindungen in Qt 5?

DDD
Freigeben: 2024-12-15 16:19:15
Original
154 Leute haben es durchsucht

How to Resolve Overloaded Signal-Slot Connections in Qt 5?

Auflösen überlasteter Signal-Slot-Verbindungen in Qt 5

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.

Aufgetretenes Problem

Beim Versuch, Code mit der neuen Syntax zu aktualisieren, von:

QObject::connect(spinBox, SIGNAL(valueChanged(int)),
                 slider, SLOT(setValue(int));
Nach dem Login kopieren

bis:

QObject::connect(spinBox, &QSpinBox::valueChanged,
                 slider, &QSlider::setValue);
Nach dem Login kopieren

Kompilierungsfehler sind aufgrund ungelöster Probleme mit überlasteten Funktionen aufgetreten.

Überlastet Signalauflösung

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>(&amp;QSpinBox::valueChanged),
        slider, &amp;QSlider::setValue);
Nach dem Login kopieren

Für Qt 5.6 und früher:

connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&amp;QSpinBox::valueChanged),
        slider, &amp;QSlider::setValue);
Nach dem Login kopieren

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.

Alternativen

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;
    } 
};
Nach dem Login kopieren
connect(spinbox, SELECT<int>::OVERLOAD_OF(&amp;QSpinBox::valueChanged), ...)
Nach dem Login kopieren

Qt 5.7 Hilfsfunktionen:

qOverload<>(&amp;Foo:overloadedFunction)
qOverload<int, QString>(&amp;Foo:overloadedFunction)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage