QT和PySide

-- TOC --

终于还是开始学习QT了,开一篇来记录各种知识点。QT是一个历久弥新的技术框架,源代码用C++,官方提供的Python模块叫PySide。

QT

我开这篇时的最新版本,QT 6.2.4和PySide6。

清华QT镜像:https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/

QT官方文档:https://doc.qt.io/

PySide官方:https://wiki.qt.io/Qt_for_Python

安装QT

从5.14.2之后,QT官方不再提供可执行安装文件,只提供源代码。

Linux下安装QT6

Ubuntu apt安装

$ sudo apt install qt5-default qttools5-dev-tools

编译安装

$ mkdir build
$ cd build
$ ../configure -prefix /usr/local/qt6  # 各种错误会在这里提示
$ cmake --build . --parallel 4  # 看机器性能
$ sudo cmake --install .

有一个工具必须要安装,ninja,否则可能在编译qttranslations的时候,会报错,但是错误信息完全没有可用线索。

编译安装没有Qt Creator(QC)。

Windows下编译安装QT6

看到一个网友分享出来的编译过程,还未自己尝试,总结如下:

准备:

  1. Visual Studio2019(笔者使用的企业版)
  2. Python3.8 64位
  3. Perl5.24 64位
  4. ninja1.10.2
  5. cmake3.22
  6. QT6.2.2

编译:

  1. 解压QT6.2.2源码,启动VS2019的64位命令行并且切换至QT6.2.2源码目录中
  2. configure -prefix D:\QT6_x64\ -debug-and-release -opensource
  3. cmake --build . --parallel 4
  4. cmake --install .

QT开发

Linux下QT开发流程

Python中使用PySide,这个没啥可说的,就是Python开发的方式和流程,调用PySide提供的各种库即可。

C++开发流程,要使用qmake生产.pro文件,再次对.pro文件用qmake,自动生成Makefile,最后make。所以,需要自己将每个项目的代码,放到一个独立的文件夹中管理起来。

$ cat qt01.cpp
#include <QWidget>
#include <QApplication>
#include <QLabel>


int main(int argc, char **argv) {
    QApplication app(argc, argv);
    QWidget *widget = new QWidget;
    widget->setWindowTitle("hello qt");
    widget->resize(400,300);  // in frame size
    //widget->setFixedSize(400, 300);
    QLabel *label = new QLabel(widget);
    label->setText("hello qt...:");
    widget->show();

    return app.exec();
}
$ qmake -project  # get .pro file
$ qmake qt01.pro  # get Makefile
$ make            # get executable
$ make clean      

上面的步骤,还需要补充点细节:

  1. 生成.pro文件后,要手工编辑此文件,针对这个case,要增加一行QT += widgets,这表示此项目用到了widgets模块,默认已经有了coregui模块;
  2. 可以用RC_ICONS = <filename.ico>的方式,给这个app设置一个icon图片;

如果使用apt安装qt,qmake已经加入了PATH,如果是自己编译安装的,修改PATH即可,貌似不需要设置其它环境变量,上面的开发流程就可以跑通,make时能够找到正确的头文件和lib库文件。

QWidget

QWidget是几乎所有窗口部件的父类:

QWidget.png

用QWidget构建函数,创建各种类型的窗口。

# first parameter is 0, which means no parent window.
QWidget *widget = new QWidget(0, Qt::Dialog);
QWidget *widget = new QWidget(0, Qt::SplashScreen);
QWidget *widget = new QWidget(0, Qt::Dialog | Qt::FramelessWindowHint);

关于窗口类型和各种属性值,可以在Qt Creator中搜索flags,有一个Window Flags Example可以参考。

本文链接:https://cs.pynote.net/sf/202204025/

-- EOF --

-- MORE --