本学期学习了一些数据分析的方法技巧,并通过Pyside2实现GUI界面,学期结束了,来总结一下Pyside2开发中常用的一些功能,方便以后查阅。没有系统地学过,一些地方可能用的不对,麻烦大家在评论区中指出^^主要资料来源于网络

输入框自动填充 


怎么利用python将decx中的图片另存为到文件夹 python怎么把图片放到gui_前端

一个邮箱自动填充的实现效果

# 连接lineedit到
        self.ui.lineEdit_2.textChanged.connect(self.strlist_changed)

    def strlist_changed(self):

        text = self.ui.lineEdit_2.text()
        suffix_str = ['@qq.com', '@163.com',
                      '@126.com',  '@gmail.com']
        str_list = [f'{text}{i}' for i in suffix_str]
        completer = QCompleter()
        completer.setFilterMode(QtCore.Qt.MatchContains)
        self.ui.lineEdit_2.setCompleter(completer)
        model = QStringListModel()
        model.setStringList(str_list)
        completer.setModel(model)

关于导航栏的实现

以侧边栏效果为例,可以新建一个Vertical Layout,拖入4个Push Button。导航栏要保持不动,在非导航栏的部分需要响应的地方拖入Stacked Widget,连接按钮pushed事件到Stacked Widget的对应的页码即可。


怎么利用python将decx中的图片另存为到文件夹 python怎么把图片放到gui_前端_02

工具栏中的Stacked Widget控件,拖入调节大小

 代码实现:

# 在窗口的__init__函数中加
self.ui.pushButton_2.clicked.connect(self.on_button2_clicked) 
# 找到对应控件的名字替换


def on_button2_clicked(self):
    page = self.ui.stackedWidget.findChild(QWidget, "keyuser") 
    # 把"keyuser"替换成想要切换到的页面的名称即可
    self.ui.stackedWidget.setCurrentWidget(page)

通过以上的基本设计,就可以实现点击按钮切换到对应的页面的功能,无需新开别的页面。


怎么利用python将decx中的图片另存为到文件夹 python怎么把图片放到gui_ide_03

一次作业的例子

如果想做一些美化,比如不显示边框,鼠标悬停(hover)或者被点击时(checked)背景变化、字体颜色变化这些的,可以在Push Button的stylesheet中做一些修改。


怎么利用python将decx中的图片另存为到文件夹 python怎么把图片放到gui_pyqt_04

stylesheet修改代码示例

但是,存在一个缺点,点击按钮按钮生效之后,按钮就会恢复到初始状态。如果想让按钮在点击之后保持被点击的状态,这样看起来更有导航的感觉,在属性编辑器中勾选checkable和checked两个选项,这样按钮就会保持被选中的状态。再勾选一个autoExclusive选项,别的按钮被选中以后,这个按钮的选中就会自动取消。


怎么利用python将decx中的图片另存为到文件夹 python怎么把图片放到gui_控件_05

这是右边的属性编辑器,没有的话可以在工具栏的视图按钮中找到打开

 

在固定区域显示HTML文件或者需要后期生成图片文件

如果是已经有了图片文件,可以直接在QT Designer中插入Label控件,在属性中找到pixmap插入自己的图片即可。如果需要根据交互后的数据生成或者HTML文件显示的话,可以现在布局中建立一个合适大小frame或者widget控件。类似于这样。


怎么利用python将decx中的图片另存为到文件夹 python怎么把图片放到gui_pyqt_06

一个什么也没有填的只有布局思路的界面

在代码中再进行后续设置。

通过QWebEngineView来显示html文件。

# html文件的显示,在frame_25上建立QWebEngineView控件,
        # 根据它的大小设置webview的大小
        self.bro = QWebEngineView(self.ui.frame_25)
        self.bro.setFixedWidth(self.ui.frame_25.width())
        self.bro.setFixedHeight(self.ui.frame_25.height())

        # 设置浏览器网页为pyecharts图
        file_path = '' # 这里添加上Html文件的路径
        with open(file_path,'r') as file:
            html_content = file.read()
        self.bro.setHtml(html_content)

这里有一个非常非常重要的点,QWebEngineView运行的时候对于路径非常敏感,如果你的python解释器的路径中含有中文,它就运行不起来,只会debug时候默默显示,尽管运行文件夹里是有QtWebEngineProcess.exe这个文件的。


怎么利用python将decx中的图片另存为到文件夹 python怎么把图片放到gui_前端_07

debug的报错

通过QGraphicsView来显示matplotlib等等生成的图片

思路还是一样的,先获取目标控件的大小,生成对应大小的图片。

home_width = self.ui.graphicsView.width()
        home_height = self.ui.graphicsView.height()
        fig = plt.figure(figsize=(home_width/100, home_height/100))
        self.canvas = FigureCanvas(fig)

        # 加载的图形(FigureCanvas)不能直接放到graphicview控件中,必须先放到graphicScene,然后再把graphicscene放到graphicview中
        self.graphic_scene = QGraphicsScene()  # 创建一个QGraphicsScene
        self.graphic_scene.addWidget(self.canvas)  # 把图形放到QGraphicsScene中,注意:图形是作为一个QWidget放到放到QGraphicsScene中的
        self.ui.graphicsView.setScene(self.graphic_scene)  # 把QGraphicsScene放入QGraphicsView
        self.ui.graphicsView.show()  # 调用show方法呈现图形
        
        # 以下是一个图形的示例代码
        df = pd.DataFrame(arr, index=region, columns=year).T
        df['yearTotal'] = np.sum(arr, axis=0)
        # 先添加好四个省市
        sns.lineplot(data=df['北京市'], label='北京市', marker='o')
        sns.lineplot(data=df['重庆市'], label='重庆市', marker='v')
        sns.lineplot(data=df['四川省'], label='四川省', marker='s')
        sns.lineplot(data=df['河南省'], label='河南省', marker='p')
        sns.lineplot(data=df['江西省'], label='江西省', marker='*')
        plt.xlabel('年份')
        plt.ylabel('GDP值(单位:亿元)')
        plt.title("2015-2021年中国分省GDP发展折线图")

开发时遇到的一些神奇的问题

1. 在QT Designer中预览时都正常,但是一放到代码中运行就会缩放!可以在运行的主函数中加一行代码:

PySide2.QtCore.QCoreApplication.setAttribute(PySide2.QtCore.Qt.AA_EnableHighDpiScaling)  # QT对于高分屏的支持!重要

2.ui文件中尽量不要放一些emoji表情,中文翻译(ui文件转py文件后会有一个retranslate函数)的时候会崩掉,出现“进程已结束,退出代码-1073741819 (0xC0000005)” 这样的报错。具体原因不清楚,当时搜了好久,也取消了pyqt兼容之类的方法试了很多都无果QAQ后面看到有朋友评论说是setText()函数的问题,一把那些emoji删除就好了