Qt 5에서 새로운 멤버 포인터 함수 구문을 사용하여 오버로드된 신호와 슬롯을 연결하려고 할 때 , 일부 사용자에게는 컴파일 오류가 발생합니다. 이 기사는 근본적인 문제를 다루고 이를 해결하기 위한 솔루션을 제공합니다.
QSpinBox의 valueChanged 신호와 QSlider의 setValue 슬롯 사이의 연결을 구현하는 제공된 예에서 오류는 동일한 이름: valueChanged(int) 및 valueChanged(QString).
Qt 5.7부터 신호 과부하 문제를 해결하는 데 도움이 되는 도우미 기능이 도입되었습니다. 이러한 기능을 사용하면 원하는 오버로드를 지정할 수 있습니다. 이 경우 다음을 사용할 수 있습니다.
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
이전 버전의 Qt의 경우 원하는 오버로드를 나타내기 위해 명시적인 캐스트가 필요합니다.
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
Qt 5.7 이전에는 적절한 기능으로 변환하기 위해 대체 접근 방식을 사용할 수 있습니다. 포인터:
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), ...)
In Qt 5.7에는 오버로드된 신호를 선택하는 프로세스를 간소화하기 위해 도우미 기능이 추가되었습니다. 주요 도우미는 qOverload(qConstOverload 및 qNonConstOverload와 같은 변형 포함)입니다.
사용 예(Qt 문서에서):
struct Foo { void overloadedFunction(); void overloadedFunction(int, QString); }; // requires C++14 qOverload<>(&Foo:overloadedFunction) qOverload<int, QString>(&Foo:overloadedFunction) // same, with C++11 QOverload<>::of(&Foo:overloadedFunction) QOverload<int, QString>::of(&Foo:overloadedFunction)
Qt 5.7 이제 과부하된 신호에 대한 문서에는 신호 과부하 문제 해결에 대한 지침이 포함됩니다. 예를 들어, valueChanged에 대한 QSpinBox 문서에서는 아래와 같이 qOverload 도우미 사용을 권장합니다.
connect(spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged), [=](const QString &text){ /* ... */ });
위 내용은 과부하된 신호와 슬롯을 연결할 때 Qt 5 컴파일 오류를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!