说明:
=====
1.1 PySide2 :这个QT的亲儿子最近(2018年7月)才出生,而且持续有团队在维护。
1.2 PyQt5:是在PySide2之前的,Qt收的义子 (Riverbank Computing这个公司开发的)。
1.3 Qt库里面有非常强大的图形界面开发库,但是Qt库是C++语言开发的,PySide2、PyQt5可以让我们通过Python语言使用Qt。推荐使用:PySide2。(终于理顺关系了)
1.4 基于Qt 的Python库
1.4.1 优点是控件比较丰富、跨平台体验好、文档完善、用户多。
1.4.2 缺点是 库比较大,发布出来的程序比较大;当然是个好东西,总得介绍介绍。
1.5 大家要开发小工具,界面比较简单,可以采用appJar,EasyGUI,PySimpleGUI,我都有介绍:
《自称是Python中GUI的终极工具:appJar》
《EasyGUI是python的一个超级简单的GUI工具介绍(一)》
《python3的PySimpleGUI库的介绍、安装、学习》
2 安装:
======
2.1 环境:华为笔记本电脑、深度deepin-linux操作系统、python3.8和微软vscode编辑器。
2.2 安装:
#安装 PySide2
pip install pyside2 #官网方法,太慢
#本机安装
#sudo pip3.8 install pyside2 #太慢
#推荐国内源安装
#sudo pip3.8 install -i https://mirrors.aliyun.com/pypi/simple pyside2
最新pyside2和pyqt5都是支持python3.8
2.3 官网:
https://doc.qt.io/qtforpython/index.html
https://wiki.qt.io/Qt_for_Python
https://forum.qt.io/category/58/qt-for-python
https://pypi.org/project/PySide2/ #最新版
https://wiki.qt.io/PySide2
2.4 竟然没有github地址:
https://github.com/PySide #PySide (deprecated),这个地址指已经弃用了
3 helloworld:最简单的一个GUI窗口开始学习:
====================================
3.1 多种方法的代码:
#方法一
from PySide2.QtWidgets import QApplication, QLabel
app=QApplication()
label=QLabel("Hello World")
label.show()
app.exec_()
#方法二
from PySide2.QtWidgets import QApplication, QLabel
if __name__=="__main__":
app=QApplication()
label=QLabel("Hello World")
label.show()
app.exec_()
#方法三
from PySide2.QtWidgets import QApplication, QLabel
def main():
app=QApplication()
label=QLabel("Hello World")
label.show()
app.exec_()
if __name__=="__main__":
main()
#方法四
import sys
from PySide2.QtWidgets import QApplication, QLabel
if __name__=="__main__":
app=QApplication(sys.argv) #python的sys.argv的知识点
label=QLabel("Hello World")
label.show()
sys.exit(app.exec_())
3.2 python的sys.argv:(引申)
3.2.1 sys.argv[0]表示代码本身文件路径。
3.2.2 sys.argv[ ]其实就是一个列表,里边的项为用户输入的参数,关键就是要明白这参数是从程序外部输入的,而非代码本身的什么地方,要想看到它的效果就应该将程序保存了,从外部来运行程序并给出参数。
3.3 效果图:
4 美化上述:
=========
4.1 QLabel的文本的字体大小和颜色:
from PySide2.QtWidgets import QApplication, QLabel
app=QApplication()
#文本设置:字体大小和颜色定义
label=QLabel("<font color=red size=40>Hello World!</font>")
label.show()
app.exec_()
4.2 窗口大小、位置和标题名:
#方法一
from PySide2.QtWidgets import QApplication, QWidget
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("中文显示窗口")
#窗口位置和大小
self.setGeometry(300,300, 500,400)
self.setIcon()
#myApp=QApplication(sys.argv)
app=QApplication() #与上面相同
window=Window()
window.show()
app.exec_()
#方法二:窗口大小、位置和标题名,带有窗口内容显示文本的
#增加控件:QWidget,QFormLayout,QVBoxLayout
from PySide2.QtWidgets import QApplication, QLabel,QWidget,QFormLayout,QVBoxLayout
app=QApplication()
#自定义Windowti=window title=窗口相关设置:类(python的基础知识)
class Windowti(QWidget):
#初始化特性
def __init__(self):
QWidget.__init__(self)
#窗口标题名
self.setWindowTitle('你好世界!HelloWorld!') #支持中文
#self.setMinimumWidth(400) #最小窗口宽度
#窗口大小和位置
#x和y是坐标,左上角坐标为0,0
#w和h是宽和高,即窗口大小
#setGeometry(x: int, y: int, w: int, h: int)
self.setGeometry(10,10,500,500)
# Create the QVBoxLayout that lays out the whole form
self.layout=QVBoxLayout()
# Create the form layout that manages the labeled controls
self.form_layout=QFormLayout()
self.greeting=QLabel('', self)
#self.form_layout.addRow('Hello World!', self.greeting)
self.form_layout.addRow('<font color=red size=40>Hello World!</font>', self.greeting)
# Add the form layout to the main VBox layout
self.layout.addLayout(self.form_layout)
# Set the VBox layout as the window's main layout
self.setLayout(self.layout)
def run(self):
# Show the form
self.show()
# Run the qt application
app.exec_()
myfirstapp=Windowti()
myfirstapp.run()
效果图:
4.3 qml法:
4.3.1 文件夹:1hw下面有2个文件:main.py和mian.qml
4.3.2 main.py代码:
from PySide2.QtWidgets import QApplication
from PySide2.QtQml import QQmlApplicationEngine
if __name__=="__main__":
app=QApplication()
#注意main.qml文件的目录和路径
engine=QQmlApplicationEngine("/home/xgj/Desktop/pyside2/1hw/main.qml")
app.exec_()
4.3.3 main.qml代码:注意:安装插件:Qt for python,这样qml代码才有高亮。
import QtQuick 2.7
import QtQuick.Window 2.3
import QtQuick.Controls 2.3
ApplicationWindow {
id: _window
// 窗口标题设置
title: "qml显示窗口Helloworld!"
// 窗口大小和位置的设置
width: 800
height: 500
x:300
y:300
// Window默认不可见,需要进行设置为可见
visible: true
}
4.3.4 运行效果图:
5 图片显示:
========
5.1 静态图片显示:
from PySide2.QtWidgets import QApplication, QLabel
from PySide2.QtGui import QPixmap
#app=QApplication([])
app=QApplication() #等同于上面
Label=QLabel()
#指定图片的目录和路径,图片格式:jpeg,jpg,png,ico均可
PixMap=QPixmap("/home/xgj/Desktop/pyside2/20.jpeg")
#PixMap=QPixmap("/home/xgj/Desktop/pyside2/18.jpg")
#PixMap=QPixmap("/home/xgj/Desktop/pyside2/1231.png")
#PixMap=QPixmap("/home/xgj/Desktop/pyside2/1.ico")
#PixMap=QPixmap("/home/xgj/Desktop/pyside2/yytd.gif") #显示静态的,不是gif动态的
Label.setPixmap(PixMap)
Label.show()
app.exec_()
效果图:
5.2 gif图显示:
from PySide2.QtWidgets import QApplication, QLabel
from PySide2.QtGui import QMovie
#app=QApplication([])
app=QApplication()
Label=QLabel()
#注意不要把这行放到实例化app对象的上面,会无效
#gif因为是动态的,属于movie动画类
Movie=QMovie("/home/xgj/Desktop/pyside2/yytd.gif") #可以
#Movie=QMovie("/home/xgj/Desktop/pyside2/test.mp4") #报错
Label.setMovie(Movie)
#这句表示播放动画,不能省略。也不能放到show后面,否则无法自适应大小
Movie.start()
Label.show()
app.exec_()
效果图:
====很仔细,初始pyside2===
整理并分享出来,喜欢的就点赞、关注、评论、转发和收藏。
通用移动类,目标就是为了实现放入任意的控件以后,支持鼠标拖动,在容器中或者父类中拖动,这个应用场景非常多,比如在地图上放置的设备,需要用户自行按下拖动到指定的合适的位置,然后保存设备的位置坐标到数据库,下次打开直接加载,在一些安防项目、电力项目、环境监测等上面大量运用,有时候设备对应了多种类型,以前做的办法是将这个移动的代码直接封装在对应设备的自定义控件中,有个巨大缺点就是如果再新增加一个控件,又需要重复的代码加到控件中才行,可否将这个功能独立出来,只要传入控件就行呢,当然可以,比如我写过很多自定义控件,现在需要控件放到某个容器中能自由拖动,只需要new出通用移动类来就行。
项目开源地址:https://gitee.com/feiyangqingyun/QWidgetDemo
#ifndef MOVEWIDGET_H
#define MOVEWIDGET_H
/**
* 通用控件移动类 作者:feiyangqingyun(QQ:517216493) 2019-9-28
* 1:可以指定需要移动的widget
* 2:可设置是否限定鼠标左键拖动
* 3:支持任意widget控件
*/
#include <QWidget>
#ifdef quc
#if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
#include <QtDesigner/QDesignerExportWidget>
#else
#include <QtUiPlugin/QDesignerExportWidget>
#endif
class QDESIGNER_WIDGET_EXPORT MoveWidget : public QObject
#else
class MoveWidget : public QObject
#endif
{
Q_OBJECT
public:
explicit MoveWidget(QObject *parent=0);
protected:
bool eventFilter(QObject *watched, QEvent *event);
private:
QPoint lastPoint; //最后按下的坐标
bool pressed; //鼠标是否按下
bool leftButton; //限定鼠标左键
QWidget *widget; //移动的控件
public Q_SLOTS:
//设置是否限定鼠标左键
void setLeftButton(bool leftButton);
//设置要移动的控件
void setWidget(QWidget *widget);
};
#endif // MOVEWIDGET_H
【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】
点击这里:「链接」
#include "movewidget.h"
#include "qevent.h"
#include "qdebug.h"
MoveWidget::MoveWidget(QObject *parent) : QObject(parent)
{
lastPoint=QPoint(0, 0);
pressed=false;
leftButton=true;
widget=0;
}
bool MoveWidget::eventFilter(QObject *watched, QEvent *event)
{
if (widget !=0 && watched==widget) {
QMouseEvent *mouseEvent=(QMouseEvent *)event;
if (mouseEvent->type()==QEvent::MouseButtonPress) {
//如果限定了只能鼠标左键拖动则判断当前是否是鼠标左键
if (leftButton && mouseEvent->button() !=Qt::LeftButton) {
return false;
}
//判断控件的区域是否包含了当前鼠标的坐标
if (widget->rect().contains(mouseEvent->pos())) {
lastPoint=mouseEvent->pos();
pressed=true;
}
} else if (mouseEvent->type()==QEvent::MouseMove && pressed) {
//计算坐标偏移值,调用move函数移动过去
int offsetX=mouseEvent->pos().x() - lastPoint.x();
int offsetY=mouseEvent->pos().y() - lastPoint.y();
widget->move(widget->x() + offsetX, widget->y() + offsetY);
} else if (mouseEvent->type()==QEvent::MouseButtonRelease && pressed) {
pressed=false;
}
}
return QObject::eventFilter(watched, event);
}
void MoveWidget::setWidget(QWidget *widget)
{
if (this->widget==0) {
this->widget=widget;
this->widget->installEventFilter(this);
}
}
void MoveWidget::setLeftButton(bool leftButton)
{
this->leftButton=leftButton;
}
原文链接:https://www.cnblogs.com/feiyangqingyun/p/11608377.html
【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】
点击这里:Qt资料领取(视频教程+文档+代码+项目实战)
百度在线地图的应用老早就做过,后面经过不断的完善才到今天的这个程序,除了基本的可以载入地图并设置一些相关的属性以外,还增加了各种js函数直接异步加载数据比如动态添加点、矩形、圆形、行政区划等各种。当然最大的是增加了离线地图的支持,当年这个离线地图拖了很久很久才去做,最终还是搞定了。
在线地图没有太多的难点,搞一个简单的在线地图demo绝对是分分钟几行代码的事情,在使用过程中就是改进了几个小的地方,比如地图的边距,需要设置增加一行css为 html,body{height:100%;width:100%;margin:0px;padding:0px;},比如左下角有个百度的logo,要去除的话也是增加一行css为 .anchorBL{display:none;},不然发布出去别人看到了怎么还有百度的logo怪没有面子的。再比如滚动条的样式,很多人说我明明设置了Qt的滚动条样式啊,为什么这里边的滚动条没有效果呢?其实这里面的滚动条是网页的,并不受控制的,你需要设置网页的滚动条css如下。
::-webkit-scrollbar{width:0.8em;}
::-webkit-scrollbar-track{background:rgb(241,241,241);}
::-webkit-scrollbar-thumb{background:rgb(188,188,188);}
1. 同时支持在线地图和离线地图两种模式。
2. 同时支持webkit内核、webengine内核、IE内核。
3. 支持设置多个标注点,信息包括名称、地址、经纬度。
4. 可设置地图是否可单击、拖动、鼠标滚轮缩放。
5. 可设置协议版本、秘钥、主题样式、中心坐标、中心城市、地理编码位置等。
6. 可设置地图缩放比例和级别,缩略图、比例尺、路况信息等控件的可见。
7. 支持地图交互,比如鼠标按下获取对应位置的经纬度。
8. 支持查询路线,可设置起点位置、终点位置、路线模式、路线方式、路线方案(最少时间、最少换乘、最少步行、不乘地铁、最短距离、避开高速)。
9. 可显示点线面工具,可直接在地图上划线、点、矩形、圆形等。
10. 可设置行政区划,指定某个城市区域绘制图层,在线地图自动输出行政区划边界点集合到js文件给离线地图使用。
11. 可静态或者动态添加多个覆盖物。支持点、折线、多边形、矩形、圆形、弧线、点聚合等。
12. 函数接口友好和统一,使用简单方便,就一个类。
13. 支持js动态交互添加点、删除点、清空点、重置点,不需要刷新页面。
14. 支持任意Qt版本、任意系统、任意编译器。
国内站点:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)
国际站点:[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun)
*请认真填写需求信息,我们会在24小时内与您取得联系。