良い一日
バックグラウンド:
私は自分のアプリケーションをDebianシステムに構築してテストデプロイする段階にありますが、いくつかの問題が発生しました
ドキュメントページで提案されているようにQOverload
、私のアプリケーションはQNetworkReplyを使用しています。
使用例は(ドキュメントページから):
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
見つかったかを確認し、ヘッダーを含めることができます。
QOverloadはにありますが、QT5.7qglobal.h
でのみ導入されました。
QoverloadではC ++ 11を使用する必要があります
または、C ++ 14を使用したqOverload
問題は、Ubuntu16.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がこれを無視し、すべてをビルドするのはなぜですか?
可能な代替ソリューションで更新する
QOverload
完全に削除し、QT 5.7より前のコードに置き換えます。これにより、コードが少し大きくなり、冗長なコードになる可能性があります(可能性があります)あなたはstatic_cast
置き換えるために使用することができますQOverload
:
connect(networkReply, static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error),
[=](QNetworkReply::NetworkError code){ /* ... */ });
ここから:Qt5で過負荷の信号とスロットを接続する
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加