[每周一更]-(第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
安装和配置
- 安装Qt和Go:确保你已经安装了Qt和Go。
-
安装
therecipe/qt
:
go get -u -v github.com/therecipe/qt/cmd/...
-
配置
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
安装和配置
- 安装PyQt5:
pip install PyQt5
或
- 安装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是一个不太常见的绑定库。需要自己编译和配置,社区支持较少,因此不推荐在生产环境中使用。若要尝试:
- 克隆PHP-Qt仓库:
git clone https://github.com/qi-plugins/php-qt.git
- 编译和安装:
按照仓库中的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。
安装和配置
- 安装Qt:确保安装Qt开发工具。
- 编写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 的开发者,学习成本较高。
上一篇: PHP反序列化入门教
下一篇: 基于PHP网上投票系