>백엔드 개발 >C++ >과부하된 신호와 슬롯을 연결할 때 Qt 5 컴파일 오류를 해결하는 방법은 무엇입니까?

과부하된 신호와 슬롯을 연결할 때 Qt 5 컴파일 오류를 해결하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-09 18:52:15533검색

How to Resolve Qt 5 Compilation Errors When Connecting Overloaded Signals and Slots?

Qt 5에서 오버로드된 신호 및 슬롯의 연결 문제 해결

Qt 5에서 새로운 멤버 포인터 함수 구문을 사용하여 오버로드된 신호와 슬롯을 연결하려고 할 때 , 일부 사용자에게는 컴파일 오류가 발생합니다. 이 기사는 근본적인 문제를 다루고 이를 해결하기 위한 솔루션을 제공합니다.

QSpinBox의 valueChanged 신호와 QSlider의 setValue 슬롯 사이의 연결을 구현하는 제공된 예에서 오류는 동일한 이름: valueChanged(int) 및 valueChanged(QString).

오버로딩 해결 문제

Qt 5.7부터 신호 과부하 문제를 해결하는 데 도움이 되는 도우미 기능이 도입되었습니다. 이러한 기능을 사용하면 원하는 오버로드를 지정할 수 있습니다. 이 경우 다음을 사용할 수 있습니다.

connect(spinbox, qOverload<int>(&amp;QSpinBox::valueChanged),
        slider, &amp;QSlider::setValue);

이전 버전의 Qt의 경우 원하는 오버로드를 나타내기 위해 명시적인 캐스트가 필요합니다.

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

이전 Qt 버전에 대한 대안

Qt 5.7 이전에는 적절한 기능으로 변환하기 위해 대체 접근 방식을 사용할 수 있습니다. 포인터:

  • C 11 조각: 이 템플릿 메타함수는 원하는 함수 포인터를 파생합니다:
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 개선

In Qt 5.7에는 오버로드된 신호를 선택하는 프로세스를 간소화하기 위해 도우미 기능이 추가되었습니다. 주요 도우미는 qOverload(qConstOverload 및 qNonConstOverload와 같은 변형 포함)입니다.

사용 예(Qt 문서에서):

struct Foo {
    void overloadedFunction();
    void overloadedFunction(int, QString);
};

// requires C++14
qOverload<>(&amp;Foo:overloadedFunction)
qOverload<int, QString>(&amp;Foo:overloadedFunction)

// same, with C++11
QOverload<>::of(&amp;Foo:overloadedFunction)
QOverload<int, QString>::of(&amp;Foo:overloadedFunction)

Signal Overload Documentation

Qt 5.7 이제 과부하된 신호에 대한 문서에는 신호 과부하 문제 해결에 대한 지침이 포함됩니다. 예를 들어, valueChanged에 대한 QSpinBox 문서에서는 아래와 같이 qOverload 도우미 사용을 권장합니다.

connect(spinBox, QOverload<const QString &amp;>::of(&amp;QSpinBox::valueChanged),
[=](const QString &amp;text){ /* ... */ });

위 내용은 과부하된 신호와 슬롯을 연결할 때 Qt 5 컴파일 오류를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.