QtプロジェクトのQt6エクスペリエンスサマリーへのアップグレード

1直感的な要約

  1. 多くのホイールが追加され、元のモジュールはより慎重に分割されており、拡張と管理に便利であると推定されます。
  2. 1つの関数のみが関数を実行するように、一部の過剰カプセル化(同じ関数の複数の関数など)を削除しました。
  3. Qt5のQt4と互換性のあるいくつかのメソッドは廃止されており、Qt5の対応する新しい関数を使用する必要があります。
  4. 時代のペースに合わせて、増大する顧客のニーズを満たすために多くの新機能が追加されました。
  5. 運用効率を向上させるために、特定のモジュールとタイプおよび処理の革新的な書き直しが行われました。
  6. long*からqintptr*などのパラメータータイプに変更があり、その後の拡張とさまざまな32-64ビットシステムとの互換性により適しています。
  7. ソースコードのdoubleデータ型はすべてqrealに置き換えられています。これは、一貫性が高く、Qtの内部データ型と統合されています。
  8. 私がテストしたのはQWidgetパーツだけで、クイックパーツはテストされていません。クイックパーツはさらに更新される可能性があると推定されます。
  9. Qt6.0とQt6.2の間のバージョンは、当面は使用しないことを強くお勧めします。一部のモジュールはまだ欠落しており、比較的多くのバグがあります。バージョン6.2.2を正式に移行することをお勧めします。

2経験の要約

  1. ユニバーサルメソッド:バージョン5.15をインストールし、エラーを報告した関数を見つけて、ソースターミナルファイルに切り替えると、対応するプロンプトQT_DEPRECATED_X(「UsesizeInBytes」)と新しい関数が表示されます。このプロンプトに従ってクラスを変更するのが正しいです。一部の関数はQt5.75.95.10および他のバージョンから新しく追加されています。プロジェクトはまだQt4メソッドを使用しているかもしれませんが、Qt6はこれらの古いメソッドと互換性があります。新しい方法。

  2. Qt6はコアのコアクラスを分割し、core5compatを追加するため、対応するモジュールをproに追加し、対応するヘッダーファイルをコードに導入する必要があります。

//pro文件引入模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat

//代码中引入头文件
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
#include <QtWidgets>
#endif
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
#include <QtCore5Compat>
#endif
  1. デフォルトでは、Qt6は高解像度の画面サポートを有効にし、インターフェイスが非常に大きくなり、フォントもぼやけます。プログラムの多くの座標計算でdevicePixelRatioを操作に使用しないため、多くの人はそれに慣れません。 、100%は奇妙に見えます。座標が正確でないため、問題が発生します。この効果をキャンセルするには、高解像度の画面ズーム率を設定します。
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
    QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Floor);
#endif
  1. 元の乱数関数はQRandomGeneratorに置き換えるように求めます。すべてのqtバージョンと互換性を持たせるために、最小限の変更は、qsrand関数をsrandに、qrand関数をrandに置き換えるなど、C++で乱数を直接使用することです。 。ソースコードを表示した後、実際にパッケージ化されています。これはC ++の乱数であり、qSinによってパッケージ化されたsinなどの多くの同様のパッケージです。

  2. QColorの光は明るい色に、暗い色は暗い色に変わります。実際、明るい色と暗い色の2つの方法は以前から存在していました。

  3. QFontMetricsFのfm.widthはfm.horizo​​ntalAdvanceに置き換えられ、5.11以降は新しい関数が使用されています。

  4. QPaletteパレット列挙値、Foreground = WindowText、Background = Window、ForegroundとBackgroundはなくなり、代わりにWindowTextとWindowを使用する必要があります。これは以前にありました。同様に、setTextColorはsetForegroundに変更されました。

  5. QWheelEventのdelta()をangleDelta()。y()に変更し、pos()をposition()に変更します。

  6. svgモジュールはsvgwidgetsから分割されています。このモジュールを使用する場合は、プロでQT + = svgwidgetsを追加する必要があります。同様に、openglモジュールはopenglwidgetsから分割されます。

  7. qlayoutのmargin()関数はcontentsMargins()。left()に置き換えられます。ソースコードを確認し、前のmargin()がcontentsMargins()。left()を返すことを確認します。4つの値が同じ場合、デフォルトの4つの値は同じです。同様に、setMarginは削除され、setContentsMarginsが使用されます。

  8. 以前は、QChar c=0xf105を強制変換に変更する必要がありますQCharc=(QChar)0xf105、暗黙の変換はもうありません。そうでない場合、コンパイラはエラーを報告します:「int」から「QChar」への変換はあいまいです。

  9. qSortなどの一部の関数は、C++のstd::sortを使用します。

#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
    std::sort(ipv4s.begin(), ipv4s.end());
#else
    qSort(ipv4s);
#endif
  1. Qt::WA_NoBackground 改成 Qt::WA_OpaquePaintEvent 。

  2. QMatrixクラスは廃止され、QTransformに置き換えられました。関数は基本的に同じです。QTransformクラスは常にQt4で使用できます。

  3. QTimeのタイミングは削除されており、QElapsedTimerに変更する必要があります。QElapsedTimerクラスは常にQt4に存在していました。

  4. QApplication :: desktop()は廃止され、QApplication :: primaryScreen()が優先されます。

#if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
#include "qscreen.h"
#define deskGeometry qApp->primaryScreen()->geometry()
#define deskGeometry2 qApp->primaryScreen()->availableGeometry()
#else
#include "qdesktopwidget.h"
#define deskGeometry qApp->desktop()->geometry()
#define deskGeometry2 qApp->desktop()->availableGeometry()
#endif
  1. 現在の画面インデックスとサイズの取得は、個別に処理する必要があります。
//获取当前屏幕索引
int QUIHelper::getScreenIndex()
{
    
    
    //需要对多个屏幕进行处理
    int screenIndex = 0;
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
    int screenCount = qApp->screens().count();
#else
    int screenCount = qApp->desktop()->screenCount();
#endif

    if (screenCount > 1) {
    
    
        //找到当前鼠标所在屏幕
        QPoint pos = QCursor::pos();
        for (int i = 0; i < screenCount; ++i) {
    
    
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
            if (qApp->screens().at(i)->geometry().contains(pos)) {
    
    
#else
            if (qApp->desktop()->screenGeometry(i).contains(pos)) {
    
    
#endif
                screenIndex = i;
                break;
            }
        }
    }
    return screenIndex;
}

//获取当前屏幕尺寸区域
QRect QUIHelper::getScreenRect(bool available)
{
    
    
    QRect rect;
    int screenIndex = QUIHelper::getScreenIndex();
    if (available) {
    
    
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
        rect = qApp->screens().at(screenIndex)->availableGeometry();
#else
        rect = qApp->desktop()->availableGeometry(screenIndex);
#endif
    } else {
    
    
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
        rect = qApp->screens().at(screenIndex)->geometry();
#else
        rect = qApp->desktop()->screenGeometry(screenIndex);
#endif
    }
    return rect;
}
  1. QRegExpクラスはcore5compatモジュールに移動されており、ヘッダー・ファイル#includeをアクティブに導入する必要があります。
    //设置限制只能输入数字+小数位
    QString pattern = "^-?[0-9]+([.]{1}[0-9]+){0,1}$";
    //设置IP地址校验过滤
    QString pattern = "(2[0-5]{2}|2[0-4][0-9]|1?[0-9]{1,2})";

    //确切的说 QRegularExpression QRegularExpressionValidator 从5.0 5.1开始就有
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
    QRegularExpression regExp(pattern);
    QRegularExpressionValidator *validator = new QRegularExpressionValidator(regExp, this);
#else
    QRegExp regExp(pattern);
    QRegExpValidator *validator = new QRegExpValidator(regExp, this);
#endif
    lineEdit->setValidator(validator);
  1. QWheelEvent構築パラメーターと対応する計算方向関数が変更されました。
//模拟鼠标滚轮
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
QWheelEvent wheelEvent(QPoint(0, 0), -scal, Qt::LeftButton, Qt::NoModifier);
#else
QWheelEvent wheelEvent(QPointF(0, 0), QPointF(0, 0), QPoint(0, 0), QPoint(0, -scal), Qt::LeftButton, Qt::NoModifier, Qt::ScrollBegin, false);
#endif
QApplication::sendEvent(widget, &wheelEvent);

//鼠标滚轮直接修改值
QWheelEvent *whellEvent = (QWheelEvent *)event;
//滚动的角度,*8就是鼠标滚动的距离
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
int degrees = whellEvent->delta() / 8;
#else
int degrees = whellEvent->angleDelta().x() / 8;
#endif
//滚动的步数,*15就是鼠标滚动的角度
int steps = degrees / 15;
  1. qVariantValueはqvariant_castに変更され、qVariantSetValue(v、value)はv.setValue(val)に変更されます。これは、最も原始的なメソッドに戻ることと同じです。qVariantValueソースコードパッケージの表示はqvariant_castです。

  2. QStyleOptionのinitがinitFromに変更されます。

  3. QVariant::TypeはQMetaType::Typeに置き換えられ、以前のQVariant::TypeはQMetaType::Typeをカプセル化します。

  4. QStyleOptionViewItemV2 V3 V4などはすべてなくなり、一時的にQStyleOptionViewItemに置き換えることができます。

  5. QFontのresolveのオーバーロードされた関数は、resolveMaskに置き換えられます。

  6. QSettingsのsetIniCodecメソッドが削除されました。デフォルトはutf8であり、設定する必要はありません。

  7. qcomboboxのactivate(QString)およびcurrentIndexChanged(QString)シグナルが削除され、int indexパラメーターが使用されてから、値がインデックスによって取得されます。個人的には、これを削除すべきではないと思います。

  8. qtscriptモジュールは完全になくなりましたが、Qt5時代の新しいバージョンから放棄されたモジュールであることが求められ、Qt6まで正式に放棄されず、すべての種類のjsonデータ解析がqjsonクラス解析に置き換えられました。

  9. QByteArrayのappendindexOflastIndexOfなどの多くのメソッドのQStringパラメーターのオーバーロード関数は廃止されました。QByteArrayを直接渡すには、元のパラメーターに.toUtf8()を追加します。ソースコードを見ると、以前のQStringパラメーターも.toUtf8()に変換されてから、比較されていることがわかります。

  10. QDateTimeの時間変換関数toTime_t+setTime_tの名前が変更され、対応する名前がtoSecsSinceEpoch+setSecsSinceEpochに変更されました。これら2つのメソッドはQt5.8で新しく追加されました。

  11. QLabelのピックスマップ関数は以前はポインター*pixmap()でしたが、現在はpixmap()への参照になっています。

  12. QTableWidgetのsortByColumnメソッドは、デフォルトの昇順メソッドを削除します。2番目のパラメーターは、昇順または降順を示すために入力する必要があります。

  13. qtnetworkのエラー信号エラーはerrorOccurredに置き換えられます。

#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
    connect(tcpSocket, SIGNAL(errorOccurred(QAbstractSocket::SocketError)), this, SLOT(error()));
#else
    connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error()));
#endif
  1. XmlPatternsモジュールはなく、すべてがxmlモジュールで再解析されます。

  2. nativeEventのパラメータタイプが変更されました。

#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
bool nativeEvent(const QByteArray &eventType, void *message, qintptr *result);
#else
bool nativeEvent(const QByteArray &eventType, void *message, long *result);
#endif
  1. QButtonGroupのbuttonClickedシグナルのintパラメーターの関数は、すべてidClickedに名前が変更されています。
    QButtonGroup *btnGroup = new QButtonGroup(this);
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
    connect(btnGroup, SIGNAL(idClicked(int)), ui->xstackWidget, SLOT(setCurrentIndex(int)));
#else
    connect(btnGroup, SIGNAL(buttonClicked(int)), ui->xstackWidget, SLOT(setCurrentIndex(int)));
#endif
  1. QWebEngineSettingsは以前はQWebEngineSettings::defaultSettings();に変更され、QWebEngineProfile :: defaultProfile()-> settings();以前のソースコードを見ると、QWebEngineSettings :: defaultSettings();パッケージがQWebEngineProfile :: defaultProfile()-> settings();Qt6がN個の過剰にカプセル化された関数を削除するため。
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
    QWebEngineSettings *webSetting = QWebEngineProfile::defaultProfile()->settings();
#else
    QWebEngineSettings *webSetting = QWebEngineSettings::defaultSettings();
#endif
  1. Qt6は、こんにちはと言わずに、enterEventのパラメーターQEventをQEnterEventに変更しました。この変更をコンパイルしてもプロンプトは表示されません。
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
    void enterEvent(QEnterEvent *);
#else
    void enterEvent(QEvent *);
#endif

//后面经过JasonWong大佬的指点,从父类重新实现的virtual修饰的函数,建议都加上override关键字。
//这样的话一旦父类的函数或者参数变了则会提示编译报错,而不是编译通过但是运行不正常会一脸懵逼茫然,从而把锅扣给Qt。

//下面是父类函数
virtual void enterEvent(QEvent *event);
//子类建议加上override
void enterEvent(QEvent *event) override;
  1. Qt6の複数のクラスがマージされました。たとえば、QVectorはQListのエイリアスになりました。つまり、これら2つのクラスは同じクラスであり、違いはありません。両方のタイプの利点がQtに集中し、次のように書き直される可能性があります。欠点を回避するためのアルゴリズムまたはその他の処理。同様に、QStringListはQList <QString>のエイリアスになりました。これは同じクラスであり、個別のクラスはありません。

  2. Qt4の時代には、デフォルトのQWidgetコンストラクターの親クラスは0でした。Qt5では、Q_NULLPTRになりました。Qt6では、Qtで定義されたQ_NULLPTRの代わりにデフォルトのc ++標準のnullptrが使用されました(同様に、Q_DECL_OVERRIDEはオーバーライドに置き換えられましたなど)、歴史の重荷を完全に放棄し、未来を受け入れることかもしれません。

//下面依次是Qt4/5/6的写法
MainWindow(QWidget *parent = 0);
MainWindow(QWidget *parent = Q_NULLPTR);
MainWindow(QWidget *parent = nullptr);

//查阅Qt源码查看Q_NULLPTR原来是根据编译器定义来选择
#ifdef Q_COMPILER_NULLPTR
# define Q_NULLPTR         nullptr
#else
# define Q_NULLPTR         NULL
#endif

//Qt高版本兼容低版本写法比如Qt5/6都支持 *parent = 0 这种写法。
  1. 委任されたプログレスバースタイルQStyleOptionProgressBarクラスのプロパティの場合、水平または垂直スタイルをデフォルトの水平スタイルであるQt4に設定することはできません。また、方向を設定するには別のQStyleOptionProgressBarV2が必要です。Qt5以降、orientationおよびbottomToTopプロパティ設定が追加されました。Qt6では、orientation属性が完全に削除され、bottomToTop属性のみが削除され、デフォルトの進行状況は垂直であり、非常に複雑です。理論的には、デフォルトは水平である必要があります。ほとんどの進行状況バーのシーンは水平です。この時点でどうすればよいですか?現在の処理ロジックが変更されました。デフォルトは垂直です。水平方向を設定する場合は、styleOption.state | = QStyle::State_Horizo​​ntalを直接設定できます。Qt6のデフォルトの方向は次のとおりです。取得されたこのState_Horizo​​ntalは、Qt4から存在しており、Qt6がアクティブに設定された後は水平になります。

  2. Qt6.2バージョンはマルチメディアモジュールのサポートを追加し始めましたが、mingwコンパイラでまだ問題がありました。この問題は6.2.2まで修正されませんでした。公式ウェブサイトは、mingwコンパイラバージョンがサポートしていなかったためだと説明しました。 、および新しいバージョンは6.2.2で採用されました。mingw900_64、このコンパイラバージョンはサポートされているだけです。したがって、理論的には、6.2.2以降の新しいQt6を使用することをお勧めします。

おすすめ

転載: blog.csdn.net/feiyangqingyun/article/details/123307338