• PyQt(三) 常见控件二


    常见控件(二)

    上节地址:https://www.cnblogs.com/Blogwj123/p/16167408.html

    参考文章:https://www.cnblogs.com/caiya/p/15104266.html

    参考文章:https://www.byhy.net/tut/py/gui/qt_02/

    1.表格

    QTableWidget 是表格控件;

    表格控件单元格里面可以显示文字,也可以显示富文本、图片等内容。

    表格控件的每个单元格里面要显示内容,都必须创建一个 QTableWidgetItem 类型的对象。

    Qt Designer 如下图 选择:

    image-20220421083733603

    1.1 创建标题栏

    在界面设计师中进行创建,双击即显示设置框。

    image-20220421083951155

    同理在行里面设计会显示新的行

    image-20220421090847257

    1.2 操作行

    insertRow 方法可以在指定位置插入一行,比如

    table.insertRow(0)
    # 就插入一行到第 `1` 行这个位置, 表格原来第1行(包括原来的第1行)以后的内容,全部往下移动一行。
    

    image-20220421093732548

    table.insertRow(2)
    

    就插入一行到第 3 行这个位置, 表格原来第3行(包括原来的第3行)以后的内容,全部往下移动一行。

    removeRow 方法可以删除指定位置的一行,比如

    table.removeRow(0)
    

    就删除第 1 行, 表格原来第1行以后的内容,全部往上移动一行。

    table.removeRow(2)
    

    就删除第 3 行, 表格原来第3行以后的内容,全部往上移动一行。

    image-20220421094818386

    1.3 设置单元格

    qt 表格的单元格内的内容对象是一个单元格对象 QTableWidgetItem 实例

    如果单元格 没有被设置过 内容,可以这样

    def click_button3(self):
        item=QTableWidgetItem()
        item.setText("啊哈哈哈")
        self.ui.table1.setItem(0,0,item)
        print("app run 3 ...")
    

    image-20220421095419193

    简写

    def click_button3(self):
        # item=QTableWidgetItem()
        # item.setText("啊哈哈哈")
        self.ui.table1.setItem(0,0,QTableWidgetItem("核弹女孩"))
        print("app run 3 ...")
    

    补充:如果单用格中已经设置了文本,则会直接将原来的内容进行覆盖。

    如果单元格 已经被设置过 文本内容,item 方法可以获取指定位置的 QTableWidgetItem ,再调用这个对象的 setText 方法,就可以设置单元格文本内容,比如

    table.item(0,0).setText('白月黑羽-江老师')
    

    就设置了 第1行,第1列 的单元格里面的文本。

    table.item(2,4).setText('白月黑羽-江老师')
    

    就设置了 第3行,第5列 的单元格里面的文本。

    image-20220421095904957

    说明:表格在程序中定位使用的索引是从 0 开始的。

    1.4 设置只读

    如果希望某个单元格为 只读,不允许修改,可以使用QTableWidgetItem对象的 setFlags 方法,

    def click_button3(self):
        item=QTableWidgetItem("啊哈哈哈")
        item.setFlags(Qt.ItemIsEnabled)
        self.ui.table1.setItem(0,0,item)
        print("app run 3 ...")
    

    image-20220421100615753

    1.5 居中对齐

    def click_button3(self):
        item=QTableWidgetItem("啊哈哈哈")
        item.setTextAlignment(Qt.AlignCenter)
        self.ui.table1.setItem(0,0,item)
        print("app run 3 ...")
    

    image-20220421100923635

    1.6 获取信息

    1.6.1 获取单元格内容

    def click_button4(self):
        # self.ui.table1.item(0, 0).setText("胖子与小男孩")
        res=self.ui.table1.item(0,0).text()
        print(res)
    

    image-20220421101236207

    1.6.2 获取所有行数列数

    def click_button4(self):
        # self.ui.table1.item(0, 0).setText("胖子与小男孩")
        # res=self.ui.table1.item(0,0).text()
        res1=self.ui.table1.rowCount()
        res2=self.ui.table1.columnCount()
        print(res1,res2)
    

    image-20220421102051343

    1.6.3 获取当前选中行

    def click_button4(self):
        currentrow = self.ui.table1.currentRow()
        print(currentrow)
    

    image-20220421102300050

    1.7 设置行数和列数

    def click_button4(self):
    	# 自动生成行数和列数以数字填充
        self.ui.table1.setRowCount(6)
        self.ui.table1.setColumnCount(3)
    

    image-20220421102519076

    1.8 清除所有内容

    def click_button4(self):
        self.ui.table1.clearContents()
        # 会清除掉表格内所有的内容吗,但是表格会留下;
    

    image-20220421103416587

    def click_button4(self):
        # self.ui.table1.clearContents() # 法一
        self.ui.table1.setRowCount(0)# 法二
        # 直接将除表头外的所有内容消除
    

    image-20220421103615384

    信号:单元格内容改动

    当用户修改了一个单元格的内容,会发出 cellChanged 信号,并且携带参数指明该单元格的行号和列号。

    我们的代码可以对该信号进行相应的处理。

    # -*- coding: utf-8 -*-
    '''
    @Time    : 2022/4/21 8:44
    @Author  : ziqingbaojian
    @File    : demo_table.py
    '''
    import sys
    
    from PyQt5.QtWidgets import QWidget,QMainWindow,QApplication,QTableWidgetItem
    from PyQt5.QtCore import Qt
    from PyQt5.uic import loadUi
    
    class QtWin(QMainWindow):
        def __init__(self):
            super(QtWin, self).__init__()
            self.ui.table1.cellChanged.connect(self.item_change)
    
    
    
        def item_change(self):
            # 获取更改内容
            cfgName = self.ui.table1.item(0, 0).text() # 首列为配置名称
            cfgValue = self.ui.table1.item(0, 0).text()#
            print(cfgName,cfgValue)
    
    
    if __name__ == '__main__':
        app=QApplication(sys.argv)
        obj=QtWin()
        obj.ui.show()
        sys.exit(app.exec_())
    

    image-20220421104930609

    1.10 设定列宽、宽度自动缩放

    Qt Designer 上目前没法拖拽设定 每个列的宽度,只能在代码中指定。

    如下所示

    # 设定第1列的宽度为 180像素
    table.setColumnWidth(0, 180)
    
    # 设定第2列的宽度为 100像素
    table.setColumnWidth(1, 100)
    

    如想让 表格控件宽度 随着父窗口的缩放自动缩放,可以

    在 属性编辑器 中 勾选 HorizontalHeaderStretchLastSection

    或者使用下面代码

    table.horizontalHeader().setStretchLastSection(True)
    

    1.11 边界线样式

    表格控件的边界线颜色可以通过QSS 属性 gridline-color 指定

    如下所示

    QTableWidget {
        gridline-color: green;
    }
    

    就会指定表格边界线颜色为 绿色。

    1.12 全部代码

    # -*- coding: utf-8 -*-
    '''
    @Time    : 2022/4/21 8:44
    @Author  : ziqingbaojian
    @File    : demo_table.py
    '''
    import sys
    
    from PyQt5.QtWidgets import QWidget,QMainWindow,QApplication,QTableWidgetItem
    from PyQt5.QtCore import Qt
    from PyQt5.uic import loadUi
    
    class QtWin(QMainWindow):
        def __init__(self):
            super(QtWin, self).__init__()
            self.ui=loadUi("../ui/table.ui")
            self.ui.button1.clicked.connect(self.click_button1)
            self.ui.button2.clicked.connect(self.click_button2)
            self.ui.button3.clicked.connect(self.click_button3)
            self.ui.button4.clicked.connect(self.click_button4)
            self.ui.table1.cellChanged.connect(self.item_change)
            # self.ui.table1.insertRow(0)
        # 设置点击按钮的时候进行数据的插入
        def click_button1(self):
            self.ui.table1.insertRow(0)# 插入一行
            print("hello world")
    
        def click_button2(self):
            self.ui.table1.removeRow(0) #删除指定位置的一行,参数为函数
            print("app run ..")
    
        def click_button3(self):
            item=QTableWidgetItem("核弹女孩")
            item.setTextAlignment(Qt.AlignCenter)
            self.ui.table1.setItem(0,0,item)
            print("app run 3 ...")
    
        def click_button4(self):
            # self.ui.table1.clearContents() # 法一
            self.ui.table1.setRowCount(0)# 法二
    
    
            # self.ui.table1.setRowCount(6)
            # self.ui.table1.setColumnCount(3)
            # currentrow = self.ui.table1.currentRow()
            # print(currentrow)
    
            # self.ui.table1.item(0, 0).setText("胖子与小男孩")
            # res=self.ui.table1.item(0,0).text()
            # res1=self.ui.table1.rowCount()
            # res2=self.ui.table1.columnCount()
            # print(res1,res2)
            # print("app run 4 ...")
    
        def item_change(self):
            # 获取更改内容
            cfgName = self.ui.table1.item(0, 0).text() # 首列为配置名称
            cfgValue = self.ui.table1.item(0, 0).text()#
            print(cfgName,cfgValue)
    
    
    if __name__ == '__main__':
        app=QApplication(sys.argv)
        obj=QtWin()
        obj.ui.show()
        sys.exit(app.exec_())
    

    补充:打开文件

    QFileDialog 是一个打开文件或者文件夹选择对话框。类似于我们平时上传文件选择文件的界面

    打开文件有以下3种:

    1、单个文件打开 QFileDialog.getOpenFileName()
    2、多个文件打开 QFileDialog.getOpenFileNames()
    3、打开文件夹 QFileDialog.getExistingDirectory()

    import sys
    
    from PyQt5.QtWidgets import QWidget,QMainWindow,QApplication,QTableWidgetItem,QFileDialog
    from PyQt5 import Qt
    from PyQt5.uic import loadUi
    
    class QtWin(QMainWindow):
        def __init__(self):
            super(QtWin, self).__init__()
    
            self.ui.buttonfile.clicked.connect(self.get_file)
            self.ui.table1.cellChanged.connect(self.item_change)
            # self.ui.table1.insertRow(0)
        def get_file(self):
            QFileDialog.getOpenFileName(self,'选择文件','','Excel files(*.xlsx , *.xls)')
    

    image-20220421111255702

    2. 单选按钮 和 按钮组

    QRadioButton 是单选按钮,如下图所示

    image

    同一个父窗口 里面的多个单选按钮,只能选中一项。

    如果你有多组单选按钮, 每组都应该有不同的父控件,或者不同的Layout。

    通常建议:多组单选按钮,放到不同的 按钮组 QButtonGroup

    2.1 信号:选中状态改变

    如果用户操作点击了按钮组 QButtonGroup 中的一个按钮, QButtonGroup 就会发出 buttonClicked 信号,可以这样指定处理该信号的函数

    buttongroup.buttonClicked.connect(handleButtonClicked)
    

    然后,在处理函数中调用QButtonGroup对象的 checkedButton() 函数,返回值就是被选中的按钮对象。

    再调用这个返回的按钮对象的 text() 方法得到界面文本,就可以知道是哪个选项被选中了。

    3. 勾选按钮 和 按钮组

    QCheckBox 是勾选按钮,如下图所示

    image

    通常建议:多组勾选按钮,放到不同的 按钮组 QButtonGroup 中,按钮组就是父控件。

    可以在 Qt设计师中设置 QButtonGroup 的 exclusive 属性, 来控制 是否 只能单选一个选项。

    3.3 信号:选中状态改变

    如果用户操作点击了按钮组 QButtonGroup 中的一个按钮, QButtonGroup 就会发出 buttonClicked 信号,可以这样指定处理该信号的函数

    buttongroup.buttonClicked.connect(handleButtonClicked)
    

    QButtonGroup 设置为 单选 情况下:

    在处理函数中调用QButtonGroup对象的 checkedButton() 函数,返回值就是被选中的按钮对象。

    再调用这个返回的按钮对象的 text() 方法得到界面文本,就可以知道是哪个选项被选中了。

    QButtonGroup 设置为 多选 情况下:

    要得知哪些按钮被选中, 可以 对所有该组中的 按钮调用 isChecked 方法 ,来判断。

    4.提示框

    QMessageBox 类可以用来弹出各种提示框

    该类可以通过一系列静态方法,显示 如下弹出框

    • 错误报告

    image

    使用 critical 方法

    QMessageBox.critical(
        self.ui,
        '错误',
        '请选择爬取数据存储路径!')
    
    • 警告

    image

    使用 warning 方法

    QMessageBox.warning(
        self.ui,
        '阅读太快',
        '阅读客户协议必须超过1分钟')
    
    • 信息提示

    image

    使用 information 方法

    QMessageBox.information(
        self.ui,
        '操作成功',
        '请继续下一步操作')
    

    也可以使用 about 方法

    QMessageBox.about(
        self.ui,
        '操作成功',
        '请继续下一步操作')
    
    • 确认继续

    image

    使用 question 方法

    choice = QMessageBox.question(
        self.ui,
        '确认',
        '确定要删除本文件吗?')
    
    if choice == QMessageBox.Yes:
        print('你选择了yes')
    if choice == QMessageBox.No:
        print('你选择了no')
    
    • 输入对话框

    QInputDialog 输入对话框 只让用户输入一行数据信息,比如 姓名、年龄等。

    可以方便的用来获取简单的信息。

    image

    5. 菜单

    可以在 Qt Designer上很方便的添加菜单,如下所示

    image

    点击菜单的信号是 triggered, 处理点击菜单的的代码如下

    self.ui.actionOpenFile.triggered.connect(self.openPageFile)
    

    注意:如果菜单和工具栏有 相同的 action ,通常是先在 动作编辑器 创建一个action, 然后分别拖动到 菜单 和 工具栏

    5.1 工具栏

    在 Qt 设计师上添加工具栏,可以右键点击 Main Window 类型的窗体空白处,如下所示

    image

    选择添加工具栏

    注意,只有 Main Window 类型的窗体,才能添加工具栏,如下

    image

    添加工具栏后,还要在工具栏上添加图标。

    方法是点击右下角 动作编辑器,新建动作,如下图所示

    image

    然后如下图所示进行设置

    image

    添加动作成功后,就可以直接拖到工具栏上了。

    然后,在代码中定义动作触发后的处理函数,如下所示

    self.ui.actionAddNote.triggered.connect(self.actionAddNode)
    

    5.2 状态栏

    要在状态栏显示文本信息,只需要调用 QStatusBar 的 showMessage 方法

    self.ui.statusbar.showMessage(f'打开文件{filePath}')
    
  • 相关阅读:
    python自动化测试框架的unittest与pytest前后置条件的区别
    XPTH定位总结
    自动化用例设计原则
    python 自动化测试框架unittest与pytest的区别
    Appium工作原理
    Fiddler抓包过滤
    monkey介绍及常用命令
    怎样安装python的 模块、 包、 库方法总结
    安装uiautomator2 + python 自动化环境
    APP自动化,怎样让应用不重置?
  • 原文地址:https://www.cnblogs.com/Blogwj123/p/16173296.html
Copyright © 2020-2023  润新知