Qt 프로젝트 를 Qt6 토혈 경험 치 총화 로 승급

9412 단어 Qt업그레이드Qt6
Qt 의 버 전 발표 가 빈번 해 지고 있 습 니 다.Qt6 발표 가 시 작 된 지 오래 되 었 습 니 다.점점 더 많은 사람들 이 이전의 코드 가 Qt6 에 대한 지원 을 증가 할 수 있 는 지 문의 하고 있 습 니 다.오픈 소스 프로젝트 인 QWidgetDemo(1 년 에 2.6K star 초과)를 포함 하여 최근 바 쁜 와 중 에 모든 프로젝트 에 Qt6 의 호 환 업 그 레이 드 를 실 시 했 습 니 다.이로부터 모든 프로젝트 가 Qt4 에서 Qt6 로 호 환 되 었 습 니 다.한 달 이 넘 게 걸 렸 습 니 다.총 업데이트 조정 코드 줄 수 1 만 여 줄.업 데 이 트 된 업 무량 이 많 지 는 않 지만 구 우 이호 의 힘 을 버 렸 습 니 다.프로젝트 수가 너무 많 기 때문에 몇 십 개의 프로젝트 작품 중 하나 인 사용자 정의 컨트롤 만 188 개의 프로젝트 입 니 다.자신 도 편리 하 게 경험 을 공유 하기 위해 Qt4 호 환 에서 Qt6 까지 의 경험 포 인 트 를 정 리 했 습 니 다.다만 부분,후기 에 계속 업데이트 되 었 습 니 다.여러분 의 댓 글 보충 도 환영 합 니 다.
직관 총화
4.567917.바퀴 를 많이 추 가 했 고 기 존의 모듈 을 더욱 세밀 하 게 나 누 었 기 때문에 관 리 를 편리 하 게 하기 위해 서 일 것 이다4.567917.과도 하 게 포 장 된 것들 을 제거(예 를 들 어 같은 기능 에 여러 개의 함수 가 있 음)하여 하나의 함수 만 이 기능 을 수행 하도록 보장 했다4.567917.Qt5 에서 Qt4 를 호 환 하 는 방법 을 폐기 하고 Qt5 에 대응 하 는 새로운 함 수 를 사용 해 야 합 니 다4.567917.시대 의 흐름 에 따라 날로 증가 하 는 고객 수 요 를 만족 시 키 기 위해 새로운 특성 을 많이 증가 했다4.567917.일부 모듈 과 유형 과 처 리 를 혁명적 으로 재 작성 하여 운영 효율 이 많이 향상 되 었 다4.567917.매개 변수 유형의 변화 가 있 습 니 다.예 를 들 어 log*부터 qintptr*등 은 후속 적 인 확대 와 32 64 비트 의 서로 다른 시스템 에 대한 호 환 에 더욱 적응 합 니 다4.567917.소스 코드 의 double 데이터 형식 은 모두 qreal 로 바 뀌 었 고 Qt 내부 데이터 형식 과 고도 로 일치 하고 통일 되 었 습 니 다4.567917.제 가 테스트 한 것 은 모두 QWidget 부분 입 니 다.quick 부분 은 테스트 하지 않 았 습 니 다.quick 부분 업데이트 가 더 많 을 것 같 습 니 다4.567917.Qt 6.0 에서 Qt 6.2 사이 의 버 전 을 사용 하지 않 는 것 을 강력 히 권장 합 니 다.일부 모듈 은 아직 부족 합 니 다.상대 적 으로 BUG 도 많 습 니 다.6.2 버 전 을 정식 적 으로 이전 하 는 것 을 추천 합 니 다경험 총화
  • 만능 방법:5.15 버 전 을 설치 하고 잘못된 함 수 를 찾 아 원본 헤더 파일 로 전환 하면 해당 알림 문 자 를 볼 수 있 습 니 다 QTDEPRECATED_X("Use size InBytes")와 새 함수.이 제시 류 에 따라 수정 하 는 것 이 맞습니다.일부 함 수 는 Qt 5.7 5.9 5.10 등 버 전에 서 새로 추 가 된 것 입 니 다.아마도 당신 의 프로젝트 가 사용 하 는 Qt4 방법 일 것 입 니 다.그러나 Qt6 는 예전 에 이런 낡은 방법 을 호 환 했 기 때문에 Qt6 에 이 르 러 서 는 새로운 방법 을 사용 해 야 합 니 다
  • Qt6 는 core 라 는 핵심 류 를 나 누 었 고 core 5 copat 가 많이 나 왔 기 때문에 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
    3.기본 Qt6 에서 높 은 점 수 를 가 진 화면 지원 을 켜 면 화면 이 커 지고 심지어 글씨체 가 허 약해져 서 많은 사람들 이 익숙 하지 않 을 것 입 니 다.이런 모델 은 프로그램 에서 많은 좌표 계산 이 device PixelRatio 로 연산 하지 않 으 면 100%이상 한 문제 가 발생 할 수 있 습 니 다.좌표 가 정확 하지 않 기 때 문 입 니 다.이 효 과 를 취소 하려 면 높 은 화면 크기 조정 인 자 를 설정 할 수 있 습 니 다.
    
    #if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
        QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Floor);
    #endif
    4.기 존의 난수 함수 알림 은 QRandomGenerator 로 대체 합 니 다.모든 qt 버 전 을 호 환 하기 위해 가장 작은 방법 은 c++의 난수 로 바 꾸 는 것 입 니 다.예 를 들 어 qsrand 함 수 를 srand 로 바 꾸 고 qrand 함 수 를 rand 로 바 꾸 는 것 입 니 다.소스 코드 를 본 적 이 있 습 니 다.사실은 봉 인 된 것 은 c++의 랜 덤 수 입 니 다.예 를 들 어 qSin 봉 인 된 sin 과 비슷 한 패키지 가 많 습 니 다.
    5.QColor 의 light 는 lighter 로,dark 는 darker 로 바 뀌 었 는데,사실 lighter,darker 라 는 두 가지 방법 은 이전에 줄곧 있 었 다.
    6.QFontMetricsF 의 fm.width 를 fm.horizontal Advance 로 바 꾸 고 5.11 부터 새 함 수 를 사용 합 니 다.
    7.QPalette 팔레트 매 거 진 값,Foreground=WindowText,Background=Window,그 중에서 Foreground 와 Background 가 없어 졌 습 니 다.WindowText 와 Window 로 대체 해 야 합 니 다.예전 에 있 었 습 니 다.비슷 한 것 은 setTextColor 가 setForeground 로 바 뀌 었 다.
    8.QWheelEvent 의 dela()는 angleDelta().y(),pos()는 position()로 변경 합 니 다.
    9.svg 모듈 은 svgwidgets 를 분 리 했 습 니 다.이 모듈 을 사용 하면 pro 에 QT+=svgwidgets 를 추가 해 야 합 니 다.
    10.qlayot 의 margin()함수 가 contentsMargins().left()로 바 뀌 었 습 니 다.원본 코드 를 보면 이전의 margin()이 되 돌아 온 것 이 contentsMargins().left()라 는 것 을 알 수 있 습 니 다.네 개의 수치 가 같 을 때 기본 네 개의 수 치 는 같 습 니 다.유사 한 것 은 setMargin 을 제거 하고 모두 setContents Margins 를 사용 합 니 다.
    11.이전 QChar c=0xf 105 는 모두 강제 변환 QChar c=(QChar)0xf 105 로 바 꿔 야 합 니 다.더 이상 암시 적 변환 이 없습니다.그렇지 않 으 면 컴 파일 오류 알림 error:conversion from'int'to'QChar'is ambiguous.
    12.qSort 등 일부 함 수 는 c++의 std:sort 를 사용 합 니 다.
    
    #if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
        std::sort(ipv4s.begin(), ipv4s.end());
    #else
        qSort(ipv4s);
    #endif
    13.Qt::WA_NoBackground 를 Qt::WA 로 변경OpaquePaintEvent 。
    14.QMatrix 류 가 폐기 되 었 습 니 다.QTransform 으로 바 꾸 면 함수 기능 이 대체적으로 일치 합 니 다.QTransform 류 는 Qt4 에서 계속 있 습 니 다.
    15.QTime 타 이 머 를 지 웠 습 니 다.QElapsedTimer 로 바 꿔 야 합 니 다.QElapsedTimer 류 는 Qt4 에 있 습 니 다.
    16.QApplication::desktop()이 폐기 되 었 습 니 다.QApplication::primary Screen()으로 바 뀌 었 습 니 다.
    
    #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
    17.현재 화면 색인 과 사 이 즈 를 각각 처리 해 야 합 니 다.
    
    //        
    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;
    }
    18.QRegExp 클래스 가 core5compat 모듈 로 이동 되 었 습 니 다.헤더 파일\#include 를 주동 적 으로 도입 해 야 합 니 다.
    19.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;
    20.qVariantValue 를 qvariant 로 변경cast,qVariant SetValue(v,value)가 v.setValue(val)로 바 뀌 었 습 니 다.가장 원시 적 인 방법 으로 되 돌아 가 는 것 과 같 습 니 다.qVariantValue 소스 코드 를 보면 qvariant 입 니 다.cast。
    21.QStyleOption 의 init 가 initFrom 로 바 뀌 었 습 니 다.
    22.QVariant::Type 을 QMetaType 으로 바 꿨 습 니 다.:Type,그 자체 의 이전 QVariant::Type 이 봉 인 된 것 은 QMetaType::Type 입 니 다.
    23.QStyleOptionViewItemV 2 V3 V4 와 같은 것 이 모두 없어 졌 습 니 다.잠시 QStyleOptionViewItem 으로 대체 할 수 있 습 니 다.
    24.QFont 의 resolve 의 리 셋 함수 가 resolve Mask 로 바 뀌 었 습 니 다.
    25.QSettings 의 setInicodec 방법 이 제거 되 었 습 니 다.기본 값 은 utf 8 이 므 로 설정 할 필요 가 없습니다.
    26.qcombobox 의 activated(QString)와 currentIndexChanged(QString)신 호 는 삭 제 했 습 니 다.int 색인 인자 의 그것 을 사용 한 다음 색인 을 통 해 값 을 얻 었 습 니 다.개인 적 으로 이 건 삭제 할 필요 가 없다 고 생각 합 니 다.
    27.qtscript 모듈 은 완전히 사 라 졌 습 니 다.Qt5 시대 의 후기 버 전에 서 폐기 모듈 로 제시 되 었 음 에 도 불구 하고 Qt6 까지 일치 하 게 버 텨 야 정식 적 으로 폐기 되 었 습 니 다.각종 json 데이터 분석 은 모두 qjson 류 로 바 뀌 었 습 니 다.
    28.QByteArray 의 append index Of lastIndex Of 등 여러 방법의 QString 매개 변수 과부하 함수 가 폐기 되 었 습 니 다.QByteArray 를 직접 전송 하려 면 원래 매개 변 수 를 바탕 으로'toUtf 8()'을 추가 하 십시오.원본 코드 를 봐 도 이전의 QString 인자 도.toUtf 8()로 바 꿔 서 비교 할 수 있 습 니 다.
    29.QDateTime 의 시간 변환 함수 toTimet + setTime_t 이름 이 바 뀌 었 습 니 다.대응 하 는 것 은 toSecs SinceEpoch+setSecs SinceEpoch 로 바 뀌 었 습 니 다.이 두 가지 방법 은 Qt 5.8 에 새로 추 가 된 것 입 니 다.
    30.QLabel 의 pixmap 함 수 는 포인터*pixmap()였 으 나 이 제 는 인용 pixmap()로 바 뀌 었 습 니 다.
    31.QTableWidget 의 sortByColumn 방법 은 기본 오름차 순 을 제거 합 니 다.두 번 째 매개 변 수 를 입력 하여 오름차 순 을 표시 해 야 합 니 다.
    32.qtnetwork 의 오류 신호 error 가 error Occurred 로 바 뀌 었 습 니 다.
    33.XmlPatterns 모듈 나무 가 있 습 니 다.모두 xml 모듈 로 재 분석 합 니 다.
    34.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
    Qt 프로젝트 가 Qt6 로 업그레이드 되 었 습 니 다.

    좋은 웹페이지 즐겨찾기