QT5笔记

作者: 你猜_19ca | 来源:发表于2018-08-07 14:05 被阅读0次

    QT5.0乱码问题

    不能用QTextCodec解决乱码问题,需要用QStringLiteral("我是中文")

    QML笔记

    QML加载自定义控件提示"xxx is not type"

    原因: 路径找不到
    在main.cpp里把加载主窗口

    engine.load(QUrl(QStringLiteral("qrc:qml/main.qml")));
    

    修改成

    engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
    

    神奇的事情发生了,这样就可以直接加载qml下面的其他xxx.qml文件了

    码流图片实时刷新至QML界面

    • 继承QQuickImageProvider类,并实现requestImage接口

      构造函数调用父类构造函数,设为至Image

      AEScreenImageProvider::AEScreenImageProvider():QQuickImageProvider(QQuickImageProvider::Image){}
      

      实现requestImage接口

      QImage AEScreenImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
      {
          return this->m_img;
      }
      

      m_img是待传到QML界面的图片,该图片由码流转QImage

      传入的参数id 是指image://provider/id里的id,可以自定义值

    • QML文件按如下编写:

      Image {
          id: screenImg
          anchors.centerIn: parent
          width: 1280
          height: 720
          sourceSize.height: 720
          sourceSize.width: 1280
          cache: false
      }
      
      Connections {
          target: aeclient
          onCallQmlRefeshImg: {
              screenImg.source=""
              screenImg.source="image://aecreen"
          }
      }
      

      aeclient是后台解析码流生成QImage类,每解析一帧,发送一个callQmlRefeshImg信号, QML通过onCallQmlRefeshImg接收信号刷新页面

      emit callQmlRefeshImg(); //告诉qml要刷新图片
      

      Image有缓存机制, 通过设置cache为false和screenImg.source="" 进行清空缓存,否则不会刷新下一张图片, cache默认是true

    • 在main里按如下编写:

      AEClient *pClient = new AEClient();
      QQmlApplicationEngine engine;
      engine.rootContext()->setContextProperty("aeclient", pClient);
      engine.addImageProvider(QLatin1String("aecreen"), pClient->imgProvider());
      

      pClient注册到QML的根节点,这样在界面就可以通过aeclient别名进行调用

      aecreen注册到QML里,通过image://aecreen方式调用AEScreenImageProvider

    配置使用Material风格界面

    • 方法一:

      在main.cpp里添加如下代码

      if (qgetenv("QT_LABS_CONTROLS_STYLE").isEmpty()){
          qputenv("QT_LABS_CONTROLS_STYLE", "material");
      }
      
    • 方法二:

      在项目根路径创建文件qtquickcontrols2.conf,并把如下内容写到文件:

      ; This file can be edited to change the style of the application
      ; Read "Qt Quick Controls 2 Configuration File" for details:
      ; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html
      
      [Controls]
      Style=Material
      
      [Material]
      Theme=Dark
      ;Accent=BlueGrey
      ;Primary=BlueGray
      ;Foreground=Brown
      ;Background=Grey
      

      把该文件添加到qrc资源文件里

      在main.cpp里添加如下代码:

      engine.addImportPath("qrc:qtquickcontrols2.conf");
      

    Rectangle自适应Layout

    • 当Layout包含了Rectangle时,需要Rect随Layout变化而变化,按如下设计:

      Layout{
        Rectangle {
          Layout.fillWidth: true;
          Layout.fillHeight: true;
        }
      }
      

    QT发布依赖dll

    ​ Qt 提供了打包工具windeployqt, 利用该工具可以很方便的解决qt的依赖问题

    ​ qt源码编译release后,生成exe文件,找到生成的exe文件(以下以test.exe作为例子),将exe文件拷贝到其他地方。例如: D:/test

    ​ 通过cd命令道test.exe存放的地方,并输入下面的命令:

    windeployqt -qmldir "源码路径" test.exe --release

    命令执行完后,在D:/test下将生成qt的依赖文件。 如果你的源码使用了三方库或者生成了动态链接库,那么需要手动将需要的dll文件复制到目录下,实际

    ​ 运行试试,是不是可以正常运行。

    解决遮罩还能点击遮罩层下面控件问题

    ​ 遮罩层需要处理鼠标点击事件,使不往下再发送事件信号

    Rectangle {
       id: progress
        anchors.fill: parent
        color: "#00000000"
        z: 99
        visible: false
        Rectangle {
            anchors.fill: parent
            opacity: 0.5
            color: "white"
        }
    
        Column {
            anchors.fill: parent
            //anchors.centerIn: parent
            spacing: 20
            Text {
                text: "正在计算目录: E:/a/b/..."
                color: "white"
                font.pixelSize: 20
                anchors.centerIn: parent
            }
            ProgressBar {
                indeterminate: true
                focusPolicy: Qt.NoFocus
                anchors.centerIn: parent
            }
        }
        MouseArea{
            anchors.fill: parent;
            onPressed:{
                 mouse.accepted = true
            }
            drag.target: window  // root可拖动
        }
    }
    

    相关文章

      网友评论

        本文标题:QT5笔记

        本文链接:https://www.haomeiwen.com/subject/jmaovftx.html