[每周一更]-(第110期):QT开发最佳实战(php/go/python/javascript)

在这里插入图片描述


调研不同开发语言开发QT的最佳实战,列举以下四种对比:

  • Go:使用therecipe/qt,适合有Go开发经验的开发者。
  • Python:使用PyQt或PySide,生态成熟,适合快速开发和原型设计。在2009年8月,PySide首次发布。提供和PyQt类似的功能,并兼容API。但与PyQt不同处为使用LGPL许可。PySide可以在LGPL协议下使用,PyQt则在GPL协议下使用。
  • PHP:不推荐,PHP-Qt较复杂且不常用。
  • JavaScript:使用QML和Qt Quick,适合设计复杂UI,使用JavaScript进行逻辑编写,需要跟c++交互(QML做UI,JavaScript写逻辑,C++写后台)。

结果:Go和Python都可以,但Go的方法库长期不更新了,Python对应的PyQt、PySide官方还有不断更新

  • https://github.com/therecipe/qt.git 更新时间 4年前了,874commit,10.3k star(2024.7.24统计)
  • https://github.com/go-qml/qml.git 更新时间 10年前,341commit,2k(2024.7.24统计)
  • https://github.com/PyQt5/PyQt.git 更新时间 2个月前,562commit,6.5k star(2024.7.24统计)
  • https://pypi.org/project/PySide6/#history 最新版本:6.7.2(2024.7.24统计)
  • https://pypi.org/project/PyQt5/#history 最新版本:5.15.11(2024.7.24统计)

尽管Qt主要使用C++进行开发,但通过绑定库和桥接工具,也可以使用其他编程语言如Go、Python、PHP等来开发Qt应用。以下是使用这些语言开发Qt应用的实战方式和示例。

1. 使用 Go 开发 Qt 应用

工具:therecipe/qt
安装和配置
  1. 安装Qt和Go:确保你已经安装了Qt和Go。
  2. 安装therecipe/qt
go get -u -v github.com/therecipe/qt/cmd/...
  1. 配置therecipe/qt
$(go env GOPATH)/bin/qtsetup
示例代码
package main

import (
    "github.com/therecipe/qt/widgets"
    "os"
)

func main() {
    app := widgets.NewQApplication(len(os.Args), os.Args)
    window := widgets.NewQMainWindow(nil, 0)
    window.SetWindowTitle("Hello Qt")
    
    centralWidget := widgets.NewQWidget(nil, 0)
    window.SetCentralWidget(centralWidget)
    layout := widgets.NewQVBoxLayout()
    
    label := widgets.NewQLabel2("Hello, World!", nil, 0)
    layout.AddWidget(label, 0, 0)
    
    button := widgets.NewQPushButton2("Click me!", nil)
    layout.AddWidget(button, 0, 0)
    
    button.ConnectClicked(func(bool) {
        label.SetText("Button Clicked!")
    })
    
    centralWidget.SetLayout(layout)
    window.Show()
    app.Exec()
}

2. 使用 Python 开发 Qt 应用

工具:PyQt 或 PySide
安装和配置
  1. 安装PyQt5
pip install PyQt5

  1. 安装PySide2
pip install PySide2
示例代码(PyQt5)
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QVBoxLayout, QWidget

def main():
    app = QApplication(sys.argv)
    window = QMainWindow()
    window.setWindowTitle("Hello Qt")
    
    centralWidget = QWidget()
    window.setCentralWidget(centralWidget)
    layout = QVBoxLayout()
    
    label = QLabel("Hello, World!")
    layout.addWidget(label)
    
    button = QPushButton("Click me!")
    layout.addWidget(button)
    
    button.clicked.connect(lambda: label.setText("Button Clicked!"))
    
    centralWidget.setLayout(layout)
    window.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

3. 使用 PHP 开发 Qt 应用

工具:PHP-Qt
安装和配置

PHP-Qt是一个不太常见的绑定库。需要自己编译和配置,社区支持较少,因此不推荐在生产环境中使用。若要尝试:

  1. 克隆PHP-Qt仓库
git clone https://github.com/qi-plugins/php-qt.git
  1. 编译和安装

按照仓库中的README文件进行编译和安装。

示例代码

由于PHP-Qt的复杂性,以下示例可能需要根据具体环境调整。

<?php
// Ensure PHP-Qt extension is loaded
if (!extension_loaded('qt')) {
    dl('qt.so');
}

$application = new QApplication($argc, $argv);
$window = new QMainWindow();
$window->setWindowTitle("Hello Qt");

$centralWidget = new QWidget();
$window->setCentralWidget($centralWidget);
$layout = new QVBoxLayout();

$label = new QLabel("Hello, World!");
$layout->addWidget($label);

$button = new QPushButton("Click me!");
$layout->addWidget($button);

$button->connect($button, SIGNAL('clicked()'), function() use ($label) {
    $label->setText("Button Clicked!");
});

$centralWidget->setLayout($layout);
$window->show();
$application->exec();
?>

4. 使用 前端语言 开发 Qt 应用

工具:QML 和 Qt Quick

QML 是一种基于JavaScript的声明式语言,用于设计UI。

安装和配置
  1. 安装Qt:确保安装Qt开发工具。
  2. 编写QML文件:创建一个QML文件定义UI。
示例代码

main.qml

import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello Qt")

    Column {
        anchors.centerIn: parent

        Text {
            id: label
            text: qsTr("Hello, World!")
            font.pixelSize: 24
        }

        Button {
            text: qsTr("Click me!")
            onClicked: label.text = qsTr("Button Clicked!")
        }
    }
}

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>

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

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

    return app.exec();
}

5、常见软件的跨平台桌面应用技术对比

清理软件垃圾,发现Xmind客户端采用的是Electron,Electron是基于Web技术的跨平台桌面应用开发框架,使用HTML、CSS和JavaScript来构建应用程序,然后就延伸查了一下其他相关成熟的跨平台桌面应用技术。

5.1、代表性桌面应用
  • Google Earth:QT

    • 描述:谷歌开发的虚拟地球仪应用程序。
    • 特点:跨平台,提供3D地形和建筑物视图。
  • Discord:Electron

    • 描述:主要用于游戏玩家的语音和文字聊天工具。
    • 特点:跨平台,支持语音、视频和文本聊天。
  • Apache NetBeans:JavaFX

    • 描述:Apache 基金会开发的集成开发环境(IDE)。

    • 特点:支持多种编程语言,部分界面使用 JavaFX。

  • Microsoft Visual Studio:.NET (WPF 和 WinForms)

    • 描述:微软开发的集成开发环境(IDE)。
    • 特点:主要用于 Windows 平台,支持多种编程语言和开发工具。
5.2、常用技术优势对比
5.2.1. Electron
  • 优点:
    • 跨平台:可以在 Windows、MacOS 和 Linux 上运行。
    • 使用 Web 技术:开发者可以使用熟悉的 HTML、CSS 和 JavaScript 技术栈。
    • 丰富的生态系统:大量的开源库和工具可以加速开发。
  • 缺点:
    • 性能较低:由于基于 Chromium 和 Node.js,Electron 应用的内存和 CPU 使用较高。
    • 体积较大:Electron 应用通常比原生应用体积大。
5.2.2. Qt
  • 优点:
    • 高性能:基于 C++,性能和响应速度优越。
    • 原生体验:在各平台上提供一致的用户体验。
    • 跨平台支持:支持 Windows、MacOS、Linux、iOS 和 Android。
    • 丰富的组件库:提供大量现成的 UI 组件和工具。
  • 缺点:
    • 学习曲线:对于不熟悉 C++ 的开发者,学习成本较高。
    • 开发速度:相比 Web 技术,开发速度可能较慢。
5.2.3. JavaFX
  • 优点:
    • 跨平台:可以在 Windows、MacOS 和 Linux 上运行。
    • 丰富的 UI 组件:提供多种现成的 UI 组件。
    • 与 Java 生态系统集成:便于使用现有的 Java 库和工具。
  • 缺点:
    • 性能:相比于 Qt,JavaFX 的性能可能稍差。
    • 较低的流行度:相比于 Electron 和 Qt,JavaFX 的社区和生态系统较小。
5.2.4. .NET (WPF 和 WinForms)
  • 优点:
    • 强大的开发工具:如 Visual Studio。
    • 丰富的库和组件:.NET 生态系统提供了大量的库和组件。
    • 与 Windows 的深度集成:特别适用于 Windows 应用开发。
  • 缺点:
    • 跨平台支持有限:虽然有 .NET Core 和 MAUI,但对 MacOS 和 Linux 的支持仍在改进中。
    • 学习曲线:对于不熟悉 .NET 的开发者,学习成本较高。