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}')
posted @ 2022-04-21 11:17  紫青宝剑  阅读(425)  评论(0编辑  收藏  举报