簡體   English   中英

未在范圍內定義Qt版本檢查和QOverload

[英]Qt Version checking and QOverload not defined in scope

大家好

背景:

我正要在Debian系統上構建和測試部署我的應用程序,但是我遇到了一些麻煩

根據文檔頁面的建議,我的應用程序對QNetworkReply使用QOverload

用法示例為(從文檔頁面開始):

connect(networkReply, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),
    [=](QNetworkReply::NetworkError code){ /* ... */ });

或在我的應用程序中發現的其他用法:

# header
QButtonGroup *grpProtocol;
QMetaObject::Connection conProtocol

# implementation
conProtocol = QObject::connect(ui->grpProtocol, QOverload<QAbstractButton *, bool>::of(&QButtonGroup::buttonToggled), [this](){
    //do some action when a radio button in a QButtonGroup is toggled
});

問題:

在我的應用程序上調用make時, make報錯:

mainwindow.cpp: In member function ‘void MainWindow::initConnectors()’:
mainwindow.cpp:462:53: error: ‘QOverload’ was not declared in this scope
     conProtocol = QObject::connect(ui->grpProtocol, QOverload<QAbstractButton *, bool>::of(&QButtonGroup::buttonToggled), [this](){
                                                     ^
mainwindow.cpp:462:79: error: expected primary-expression before ‘*’ token
     conProtocol = QObject::connect(ui->grpProtocol, QOverload<QAbstractButton *, bool>::of(&QButtonGroup::buttonToggled), [this](){
                                                                               ^
mainwindow.cpp:462:80: error: expected primary-expression before ‘,’ token
     conProtocol = QObject::connect(ui->grpProtocol, QOverload<QAbstractButton *, bool>::of(&QButtonGroup::buttonToggled), [this](){
                                                                                ^
mainwindow.cpp:462:82: error: expected primary-expression before ‘bool’
     conProtocol = QObject::connect(ui->grpProtocol, QOverload<QAbstractButton *, bool>::of(&QButtonGroup::buttonToggled), [this](){
                                                                                  ^
Makefile:476: recipe for target 'mainwindow.o' failed

現在,這使我檢查何時找到QOverload並包含標題。

可以在qglobal.h中找到QOverload ,但僅在QT 5.7中引入

  • Qoverload需要使用C ++ 11

  • 或qOverload,使用C ++ 14

問題是Ubuntu 16.04使用Qt版本5.5:

qtchooser -print-env
QT_SELECT="default"
QTTOOLDIR="/usr/lib/x86_64-linux-gnu/qt5/bin"
QTLIBDIR="/usr/lib/x86_64-linux-gnu"

/usr/lib/x86_64-linux-gnu/qt5/bin/qmake -v
QMake version 3.0
Using Qt version 5.5.1 in /usr/lib/x86_64-linux-gnu

我試過的

我決定使用預處理器指令為我進行版本檢查

#if QT_VERSION <= QT_VERSION_CHECK(5, 7, 0)
    qDebug(mainclient) << "Adding connector for settings prefered connection protocol";
    conProtocol = QObject::connect(ui->grpProtocol, QOverload<QAbstractButton *, bool>::of(&QButtonGroup::buttonToggled), [this](){
        // my code here which which handles events
    });
#endif

但是,上面的make錯誤是由於包含預處理程序指令而導致的。 即包括Qt版本檢查仍然使QOverload超出范圍。

題:

簡而言之,我做錯了什么? 為什么在設置了特定的QT版本檢查后,make忽略了這一點並仍然構建了所有內容?

更新可能的替代解決方案

  1. 完全消除QOverload並替換為QT 5.7之前的代碼,這將使我的代碼稍大一些,並增加一些冗余代碼(可能)
  2. 將頭文件添加到我的應用程序文件中,並且僅當系統的Qt版本<Qt5.7時才包括它(考慮到非常不好的做法)

您可以使用static_cast替換QOverload

connect(networkReply, static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error),
    [=](QNetworkReply::NetworkError code){ /* ... */ });

從這里開始: 在Qt 5中連接過載信號和插槽

您在此處的邏輯表達式中有錯誤:

#if QT_VERSION <= QT_VERSION_CHECK(5, 7, 0)

基本上說“如果版本小於或等於 5.7,則啟用以下塊”。 並且Qt 5.5滿足此標准。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM