Qt6 开发知识点总结

(1)Qt开发版本选择

在 Qt 6.5+ 系列中,最稳定、兼容性最好的版本是:

Qt 6.5.3(当前公开最稳定的 Qt 6.5 LTS 补丁版本)


(2)完整的开发环境:

Qt 6.5.3 + QML + CMake + MSVC 2019 + Qt Creator


(3)获取当前时间戳

Component.onCompleted: {
        console.log(Qt.formatDateTime(new Date(),"yyyy-MM-dd HH:mm:ss.zzz"))

​(4)qml 实现日期时间的实时刷新显示

Item {
        Text { id: time }

        Timer {
            id:timer
            interval: 1000; running: true; repeat: true
            onTriggered: time.text = Qt.formatDateTime(new Date(), "yyyy-MM-dd HH:mm:ss.zzz") 
        }

        Component.onCompleted: {
                    timer.start();
                }

(5)QML中if else判断语句

import QtQuick

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    Item {
        Text {
            id: time
            font.pixelSize: 24
        }

        Text {
            id: txtstatus
            x: 300
            font.pixelSize: 24
            text: qsTr("状态")
        }

        Timer {
            interval: 1000; running: true; repeat: true
            onTriggered: {

                time.text = Qt.formatDateTime(new Date(), "yyyy-MM-dd hh:mm:ss")

                var d1 = '07:35:00'
                var d2 = '12:05:00'
                var d3 = '13:05:00'
                var d4 = '17:35:00'

                var d5 = Qt.formatDateTime(new Date(), "hh:mm:ss")
                console.log(d5)
                // console.log(typeof(d5))
                // console.log(typeof(d1))

                if ( d5===d1  || d5===d2 || d5===d3 || d5===d4 ){

                    txtstatus.text="正在插入..."
                    console.log("执行插入语句")
                }else{
                    txtstatus.text="等待执行插入中..."
                    console.log("等待状态!")
                }

            }

        }


    }


}


(6)QML连接数据库

(7)用CMake设置应用程序图标

  1. 先准备一张.ico的图标,命名为“appicon.ico”,放在与源文件同一级目录

  2. 新建一个名称为“appicon.rc”的文件,键入一下内容:

    IDI_ICON1 ICON DISCARDABLE "appicon.ico"

  3. 在CMakeLists.txt文件中编辑以下内容:

    set(APP_ICON_RESOURCE_WINDOWS "appicon.rc")
    qt_add_executable(appXSabre
        main.cpp
        ${APP_ICON_RESOURCE_WINDOWS}
    )                                        
  4. 编译运行程序,可以看到窗口左上角和应用程序都已有了图标

(9)QML调用另一个QML文件并显示

注意

1.调用的qml文件必须也是根元素为window,否则visible元素会报错。

2.QML的文件第一个字母必须大写

3.要调用的QML文件必须在主QML里实例化

main.qml文件

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")


    Qml1{	//实例化另一个文件,文件名称第一个要大写
        id:qwe
    }


    Rectangle {
        width: 320; height: 240
        color: "black"

        Text {
            id: txt
            text: "打开另一个窗口"
            font.pixelSize: 20
            anchors.centerIn: parent
        }
        MouseArea {
            id: mouse_area
            anchors.fill: parent  // 有效区域
            onClicked: {
                qwe.show()	//另一个qml文件显示
            }
        }
    }
}

Qml1.qml文件

import QtQuick 2.0
import QtQuick.Window 2.2

Window {
    width: 320; height: 240
    visible: false	//该窗口一开始默认隐藏的
    color: "lightblue"
    
    Text {
        id: txt
        text: "另一个窗口"
        font.pixelSize: 20
        anchors.centerIn: parent
    }
}

(9)QML调用C++

方法1:在QML系统中注册C++类型

1.新建C++类,比如:sqlconnection,继承QObject类

2.sqlconnection.h代码

// Some code

3.sqlconnection.cpp代码

// Some code

4.main.cpp主函数代码

// Some code

5.在main.qml文件中,导入注册类的命名空间,实例化对象,然后通过该对象的id来访问

该对象的属性和方法

// Some code

方法2

(10)Qt6通过CMake连接SQL Server

  1. 配置好本机的ODBC

  2. 参考帮助文档

在CMakeLists.txt文件中添加如下两行,第一行添加sql模块,第二行添加Qt6::Sql

find_package(Qt6 6.2 COMPONENTS Quick REQUIRED Sql)
target_link_libraries(appKaoQin PRIVATE Qt6::Quick Qt6::Sql)

(11)报错处理

提示:

QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed

解决方案:补充如下代码

db.close();
QSqlDatabase::removeDatabase("QODBC");

(11)QT使用QSetting将MSSQL数据库通过写入注册表创建ODBC数据源

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QSqlDatabase>
#include <QSqlError>
#include<QSqlQuery>
#include <QSettings>
#include <QString>
#include<QDebug>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    const QUrl url(u"qrc:/StudyDemo01/main.qml"_qs);
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

//以下为正式内容
    //将数据库写入注册表
        //需要管理员权限运行
        QSettings reg_2("HKEY_LOCAL_MACHINE\\SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources", QSettings::NativeFormat);
        reg_2.setValue("dsnName","SQL Server");//dsnName为数据源名

        QSettings reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\ODBC\\ODBC.INI", QSettings::NativeFormat);
        reg.beginGroup("dsnName");
        reg.setValue("Driver","C:\\Windows\\system32\\SQLSRV32.dll");
        reg.setValue("Description","database");
        reg.setValue("Server","192.168.10.10");//主机IP地址
        reg.setValue("Database","ipinfo");//databaseName为默认数据库
        reg.setValue("LastUser","sa");//用户名
        reg.setValue("Trusted_Connection","No"); //Yes集成身份验证,No为混合身份验证
        reg.setValue("PWD","123456");

        QSettings reg_1("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MSSQLServer\\Client\\ConnectTo", QSettings::NativeFormat);
        reg_1.setValue("123.56.87.47","DBMSSOCN,192.168.10.10,1433");//1433为默认端口,可修改,只改IP,其他别动




    //连接MSSQL数据库
       QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

       qDebug ()<< "sql driver "<< db.isValid();
       db.setHostName("192.168.10.10");
      //设置数据源名称
       db.setDatabaseName("dsnName");
       db.setUserName("sa");
       db.setPassword("123456");

       db.open();

       if(!db.open())
       {
           qDebug()<<db.lastError();
           //return false;


       }
       else
       {
           qDebug()<<"数据库连接成功!";
          //  return true;
           QSqlQuery query(db);

//           qDebug() << query.exec("select * from ipdata");

           query.exec("select * from ipdata");
           while(query.next())
           {
               qDebug() << query.value(0).toString() << query.value(1).toString();
           }

       }

//以上为正式内容
    return app.exec();
}

qDebug信息如下:

sql driver  true
数据库连接成功!
"物控" "192.168.10.100"
"销售" "192.168.10.1"
"销售" "192.168.10.2"
"直营部" "192.168.10.11"
"直营部" "192.168.10.11"
"直营部123" "192.168.10.11"
"直营部123" "192.168.10.11"

(12)

最后更新于

这有帮助吗?