整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

PySide2:一个基于强大Qt(ta的亲儿子) 的

PySide2:一个基于强大Qt(ta的亲儿子) 的Python的GUI库初识

说明:

=====

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

二、实现的功能

  • 1:可以指定需要移动的widget
  • 2:可设置是否限定鼠标左键拖动
  • 3:支持任意widget控件

三、效果图

四、头文件代码

#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;
}


六、控件介绍

  1. 超过150个精美控件,涵盖了各种仪表盘、进度条、进度球、指南针、曲线图、标尺、温度计、导航条、导航栏,flatui、高亮按钮、滑动选择器、农历等。远超qwt集成的控件数量。
  2. 每个类都可以独立成一个单独的控件,零耦合,每个控件一个头文件和一个实现文件,不依赖其他文件,方便单个控件以源码形式集成到项目中,较少代码量。qwt的控件类环环相扣,高度耦合,想要使用其中一个控件,必须包含所有的代码。
  3. 全部纯Qt编写,QWidget+QPainter绘制,支持Qt4.6到Qt5.13的任何Qt版本,支持mingw、msvc、gcc等编译器,支持任意操作系统比如windows+linux+mac+嵌入式linux等,不乱码,可直接集成到Qt Creator中,和自带的控件一样使用,大部分效果只要设置几个属性即可,极为方便。
  4. 每个控件都有一个对应的单独的包含该控件源码的DEMO,方便参考使用。同时还提供一个所有控件使用的集成的DEMO。
  5. 每个控件的源代码都有详细中文注释,都按照统一设计规范编写,方便学习自定义控件的编写。
  6. 每个控件默认配色和demo对应的配色都非常精美。
  7. 超过130个可见控件,6个不可见控件。
  8. 部分控件提供多种样式风格选择,多种指示器样式选择。
  9. 所有控件自适应窗体拉伸变化。
  10. 集成自定义控件属性设计器,支持拖曳设计,所见即所得,支持导入导出xml格式。
  11. 自带activex控件demo,所有控件可以直接运行在ie浏览器中。
  12. 集成fontawesome图形字体+阿里巴巴iconfont收藏的几百个图形字体,享受图形字体带来的乐趣。
  13. 所有控件最后生成一个动态库文件(dll或者so等),可以直接集成到qtcreator中拖曳设计使用。
  14. 目前已经有qml版本,后期会考虑出pyqt版本,如果用户需求量很大的话。
  15. 自定义控件插件开放动态库使用(永久免费),无任何后门和限制,请放心使用。
  16. 目前已提供26个版本的dll,其中包括了qt5.12.3 msvc2017 32+64 mingw 32+64 的。
  17. 不定期增加控件和完善控件,不定期更新SDK,欢迎各位提出建议,谢谢!
  18. Qt入门书籍推荐霍亚飞的《Qt Creator快速入门》《Qt5编程入门》,Qt进阶书籍推荐官方的《C++ GUI Qt4编程》。
  19. 强烈推荐程序员自我修养和规划系列书《大话程序员》《程序员的成长课》《解忧程序员》,受益匪浅,受益终生!
  20. SDK地址:https://gitee.com/feiyangqingyun/QUCSDK

原文链接: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)

## 四、效果图



## 五、相关代码