Qt5:エラー:WA_LockPortraitOrientation は Qt のメンバーではありません



Qt4/Symbian のサポートを維持しながら、Qt4/Symbian プロジェクトを Qt5 にコンパイルしようとしています。


現在 MainWindow::setOrientation 自動生成されたボイラープレート関数が問題を引き起こしています.


次のコンパイラ エラーが表示されます:


error: 'WA_LockPortraitOrientation' is not a member of 'Qt'
error: 'WA_LockLandscapeOrientation' is not a member of 'Qt'
error: 'WA_AutoOrientation' is not a member of 'Qt'

答え:


はい、ご指摘のとおり、これらは Qt 5 で削除されました。


その理由は、これらは Symbian のみの機能であり、特定のプラットフォームでのみ機能する場合、特にそのプラットフォームが Qt 5 でサポートされていない場合、Qt ユーザーを混乱させるだけだからです。


対応する gerrit の変更は次の場所にあります:


https://codereview.qt-project.org/#change,11280


これらの行を変更する必要があります


#if QT_VERSION < 0x040702
// Qt < 4.7.2 does not yet have the Qt::WA_*Orientation attributes

これらに:


#if (QT_VERSION < QT_VERSION_CHECK(4, 7, 2)) || (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
// Qt < 4.7.2 does not yet have the Qt::WA_*Orientation attributes
// Qt 5 has removed them.


Qt バージョンに基づいて特定の機能を条件付きで許可する良い方法は次のとおりです:


#if (QT_VERSION < QT_VERSION_CHECK(4, 7, 2)) || (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
...
#endif

これは、16 進数値をハードコーディングするよりもクリーンで優れています。また、QtSerialPort など、既存の Qt モジュールが従う推奨される方法でもあります。


いくつかのコードの回答


#include "mainwindow.h" #include <QApplication>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
#ifndef MAINWINDOW_H #define MAINWINDOW_H  #include <QMainWindow>
class Emiter { signals:
void anSignal ();
};
class MainWindow : public QMainWindow {
Q_OBJECT private slots:
void handleEmitter ();
public:
MainWindow(QWidget *parent = 0);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"  MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent) {
auto emiter = new Emiter();
connect( emiter, &Emiter::anSignal, this, &MainWindow::handleEmitter );
} void MainWindow::handleEmitter() { }
error: ‘qt_metacall’ is not a member of ‘Emiter’
enum { Value = sizeof(test(&Object::qt_metacall)) == sizeof(int) };
class Emiter : public QObject {
Q_OBJECT public: signals: void anSignal ();
};