KGC*_*beX 2 c++ qt cmake c++11 ubuntu-16.04
大家好
背景:
我正在 debian 系统上构建和测试部署我的应用程序,但是我遇到了一些麻烦
正如文档页面所建议的那样,我的应用程序QOverload
用于QNetworkReply。
一个示例用法是(来自文档页面):
connect(networkReply, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),
[=](QNetworkReply::NetworkError code){ /* ... */ });
Run Code Online (Sandbox Code Playgroud)
或在我的应用程序中发现的其他用法:
# 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
});
Run Code Online (Sandbox Code Playgroud)
问题:
在调用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
Run Code Online (Sandbox Code Playgroud)
现在,这让我检查何时QOverload
找到并包含标题。
QOverload可以qglobal.h
在 QT 5.7 中找到,但只在 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
Run Code Online (Sandbox Code Playgroud)
我试过的:
#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
Run Code Online (Sandbox Code Playgroud)
但是,make
包含预处理器指令导致的上述错误。即包括 Qt 版本检查仍然抛出 QOverload 超出范围。
题:
简单地说,我做错了什么?为什么使用特定的 QT 版本检查集,make 会忽略这一点并仍然构建所有内容?
更新可能的替代解决方案
QOverload
完全消除并替换为 QT 5.7 之前的代码,这将使我的代码稍微笨重,并且有一些冗余代码(可能)您可以使用static_cast
来替换QOverload
:
connect(networkReply, static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error),
[=](QNetworkReply::NetworkError code){ /* ... */ });
Run Code Online (Sandbox Code Playgroud)
从这里开始:在 Qt 5 中连接过载的信号和插槽
归档时间: |
|
查看次数: |
5064 次 |
最近记录: |