gpt4 book ai didi

c++ - Qt 版本检查和 QOverload 未在范围内定义

转载 作者:行者123 更新时间:2023-11-30 03:26:54 24 4
gpt4 key购买 nike

大家好

背景:

我正准备在 debian 系统上构建和测试部署我的应用程序,但是我遇到了一些麻烦

我的应用程序为 QNetworkReply 使用了 QOverload , 正如 documentation 所建议的那样页面。

示例用法是(来自文档页面):

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 并包含 header 。

QOverload可以在 qglobal.h 中找到,但仅在 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

我尝试了什么:

我决定使用 preprocessor directives to do the version check对我来说。

#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){ /* ... */ });

来自这里:Connecting overloaded signals and slots in Qt 5

关于c++ - Qt 版本检查和 QOverload 未在范围内定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47864651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com