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
DDDOriginal
2024-12-15 16:19:15154Durchsuche

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));

bis:

QObject::connect(spinBox, &QSpinBox::valueChanged,
                 slider, &QSlider::setValue);

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);

Für Qt 5.6 und früher:

connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&amp;QSpinBox::valueChanged),
        slider, &amp;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.

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

Qt 5.7 Hilfsfunktionen:

qOverload<>(&amp;Foo:overloadedFunction)
qOverload<int, QString>(&amp;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!

Stellungnahme:
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