PyQt6第四章控件功能之4.2常用控件(4.2.7列表框:QListView 和QListWidget)
列表框属于QListView类,用于以列表方式展示数据,它的子类是 QListWidget 。QListView是基于模型(Model)的,需要程序来建立模型,然后再保存数据。它已经建立了一个数据存储模型(QListWidgetItem),直接调用addItem()函数,就可以添加条目(Item)。QListView类中的常用方法如下:setModel(Model):用来设置View所关联的Mod
4.2.7列表框:QListView 和QListWidget
1. 列表框:QListView
列表框属于QListView类,用于以列表方式展示数据,它的子类是 QListWidget 。QListView是基于模型(Model)的,需要程序来建立模型,然后再保存数据。它已经建立了一个数据存储模型(QListWidgetItem),直接调用addItem()函数,就可以添加条目(Item)。QListView类中的常用方法如下:
setModel(Model):用来设置View所关联的Model,可以使用list数据类型作为数据源
selectedItem(n):选中Model中的条目n
isSelected():判断Model中的某条目是否被选中
QListView类中的常用信号如下:
clicked:当单击某项时发送
doubleClicked:当双击某项时发送
【例4.8】QlistView列表测试,结果如下:
# 导入PyQt6的QtWidgets模块,其中包含了构建图形用户界面所需的各种控件和布局
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QListView, QMessageBox
# 导入PyQt6的QtCore模块,这里主要是使用了QStringListModel,它是一个用于存储和管理字符串列表的模型
from PyQt6.QtCore import QStringListModel
# 导入sys模块,这个模块提供了对Python解释器使用或维护的一些变量的访问,以及与Python解释器强烈交互的功能
import sys
# 定义一个名为myWidget的类,它继承自QWidget,QWidget是所有用户界面对象的基类
class myWidget(QWidget):
# 初始化函数,当创建myWidget类的实例时,这个函数会被调用
def __init__(self, parent=None):
# 调用父类QWidget的初始化函数,确保父类中的所有初始化操作都被执行
super(myWidget, self).__init__(parent)
# 设置窗口的标题为"QListView测试"
self.setWindowTitle("QListView测试")
# 调整窗口的大小为300x260像素
self.resize(300, 260)
# 创建一个QStringListModel的实例,这个模型用于存储和管理字符串列表
listModel = QStringListModel()
# 创建一个字符串列表,包含四种编程语言的名称
self.list = ['C++', 'Java', 'C#', 'Python']
# 将上面创建的字符串列表设置到listModel中
listModel.setStringList(self.list)
# 创建一个QListView的实例,QListView是一个可以显示字符串列表的控件
listView = QListView()
# 将之前创建的listModel设置为listView的模型,这样listView就可以显示listModel中的数据了
listView.setModel(listModel)
# 当listView中的某个项目被点击时,调用self.clickedFunc函数
listView.clicked.connect(self.clickedFunc)
# 创建一个QVBoxLayout的实例,这是一个垂直布局管理器
layout = QVBoxLayout()
# 将listView添加到布局中
layout.addWidget(listView)
# 将这个布局设置为myWidget的布局,这样myWidget就会按照这个布局来显示其控件
self.setLayout(layout)
# 定义一个名为clickedFunc的方法,这个方法会在listView中的某个项目被点击时被调用
def clickedFunc(self, Index):
# 使用QMessageBox来显示一个信息框,标题为"ListView",内容为"选择: "加上被点击的项目的文本
QMessageBox.information(self, "ListView", "选择:" + self.list[Index.row()])
# 如果这个脚本是作为主程序运行(而不是被其他脚本导入),则执行以下代码
if __name__ == "__main__":
# 创建一个QApplication的实例,它是每一个PyQt6应用程序的核心
app = QApplication(sys.argv)
# 创建一个myWidget的实例
w = myWidget()
# 显示这个窗口
w.show()
# 进入应用程序的主事件循环,等待用户的操作,直到应用程序关闭
sys.exit(app.exec())
这段代码实现了以下功能:
- 创建了一个基于PyQt6的图形用户界面(GUI)应用程序。
- 在窗口中显示了一个
QListView
控件,该控件用于显示一个字符串列表(C++
,Java
,C#
,Python
)。 - 当用户在
QListView
中点击一个项目时,程序会弹出一个信息对话框显示被选中的项目。
使用的布局和控件:
- 布局:
QVBoxLayout
,这是一个垂直布局,它将控件垂直排列。 - 控件:
QWidget
:基础窗口部件。QListView
:一个可以显示项目列表的控件。QMessageBox
:用于显示对话框的控件。
关键语句:
self.setWindowTitle("QListView测试")
:设置窗口的标题为“QListView测试”。self.resize(300, 260)
:设置窗口的大小为300x260像素。listModel = QStringListModel()
:创建一个QStringListModel
对象,该对象用于管理字符串列表并将其作为数据源提供给QListView
。listModel.setStringList(self.list)
:将self.list
中的字符串列表设置为listModel
的数据源。listView.setModel(listModel)
:将listModel
设置为QListView
的数据模型,这样QListView
就能显示listModel
中的数据了。listView.clicked.connect(self.clickedFunc)
:当用户在QListView
中点击一个项目时,会触发clicked
信号,这个信号连接到self.clickedFunc
方法上。QMessageBox.information(self,"ListView","选择:"+self.list[Index.row()])
:在clickedFunc
方法中,当用户点击一个项目时,显示一个信息对话框,显示被选中的项目。Index.row()
获取被点击项目的行号,然后使用该行号从self.list
中获取对应的字符串。
总的来说,这段代码创建了一个简单的GUI窗口,窗口中包含一个QListView
控件,用于显示一个字符串列表。当用户点击列表中的一个项目时,程序会弹出一个对话框显示被选中的项目。
升级版:运行程序,在文本框输入“aaa”,单击“增加项”,如图(a)所示;单击“项目排序”, 如图(b)所示;单击“增加项”,如图(c)所示。
import sys # 导入Python的系统模块,用于处理命令行参数和退出程序
from PyQt6.QtWidgets import * # 从PyQt6的QtWidgets模块中导入所有类和函数
from PyQt6.QtGui import QStandardItemModel, QStandardItem # 从PyQt6的QtGui模块中导入QStandardItemModel和QStandardItem类
class myWidget(QWidget): # 定义一个名为myWidget的类,继承自QWidget
def __init__(self, parent=None): # 初始化方法,parent参数用于接收父对象
super(myWidget, self).__init__(parent) # 调用父类QWidget的初始化方法
self.setWindowTitle("QListView测试") # 设置窗口的标题为"QListView测试"
self.resize(200, 200) # 设置窗口的大小为200x200像素
self.list = ['C++', 'Java', 'C#', 'Python'] # 创建一个列表,包含四种编程语言的名称
self.mode = QStandardItemModel(4, 1) # 创建一个4行1列的QStandardItemModel对象
for i in range(self.mode.rowCount()): # 遍历模型的每一行
item = QStandardItem(self.list[i]) # 创建一个QStandardItem对象,并用列表中的元素初始化它
self.mode.setItem(i, 0, item) # 将创建的项设置到模型的指定位置
self.mode.insertRow(4, QStandardItem("数据结构")) # 在模型的第5行插入一个新的项,内容为"数据结构"
self.listview = QListView() # 创建一个QListView对象
self.listview.setModel(self.mode) # 将之前创建的模型设置为QListView的数据源
self.le = QLineEdit() # 创建一个QLineEdit对象,用于用户输入文本
self.addPb = QPushButton("增加项", clicked=self.addItem) # 创建一个QPushButton对象,设置其文本为"增加项",并连接其点击事件到addItem方法
self.delPb = QPushButton("删除项", clicked=self.delItem) # 创建一个QPushButton对象,设置其文本为"删除项",并连接其点击事件到delItem方法
self.sortPb = QPushButton("项目排序",
clicked=self.sortItem) # 创建一个QPushButton对象,设置其文本为"项目排序",并连接其点击事件到sortItem方法
hLayout = QHBoxLayout() # 创建一个水平布局对象
hLayout.setContentsMargins(0, 0, 0, 0) # 设置布局的边距为0
hLayout.addWidget(self.addPb) # 将增加按钮添加到水平布局中
hLayout.addWidget(self.delPb) # 将删除按钮添加到水平布局中
hLayout.addWidget(self.sortPb) # 将排序按钮添加到水平布局中
self.vLayout = QVBoxLayout(self) # 创建一个垂直布局对象,并将其设置为当前QWidget的布局
self.vLayout.addWidget(self.listview) # 将QListView添加到垂直布局中
self.vLayout.addWidget(self.le) # 将QLineEdit添加到垂直布局中
self.vLayout.addLayout(hLayout) # 将包含按钮的水平布局添加到垂直布局中
def addItem(self): # 定义一个方法,用于添加新的项到模型中
num = self.mode.rowCount() # 获取当前模型的行数
s = self.le.text() # 获取QLineEdit中的文本
if s != '': # 如果文本不为空
self.mode.appendRow(QStandardItem(s)) # 在模型末尾添加一个新的行,并用获取到的文本初始化
def delItem(self): # 定义一个方法,用于删除模型中的最后一个项
num = self.mode.rowCount() # 获取当前模型的行数
self.mode.removeRow(num - 1) # 删除模型中的最后一行
def sortItem(self): # 定义一个方法,用于对模型中的项进行排序
self.mode.sort(0) # 对模型的第一列进行排序
if __name__ == '__main__': # 判断当前脚本是否作为主程序运行
app = QApplication(sys.argv) # 创建一个QApplication对象,接收命令行参数
w = myWidget() # 创建一个myWidget对象
w.show() # 显示窗口,使得窗口能够呈现在屏幕上
sys.exit(app.exec()) # 进入Qt的事件循环,并等待用户交互,最后退出程序
这段代码主要实现了一个简单的窗口应用程序,其中包含一个QListView
用于显示一个列表,以及几个按钮和文本框用于与列表进行交互。列表的内容由QStandardItemModel
管理,该模型包含了一些编程语言的名称。
以下是代码中使用的布局和控件:
-
布局(Layouts):
QHBoxLayout
: 这是一个水平布局,用于放置增加、删除和排序按钮。QVBoxLayout
: 这是一个垂直布局,用于放置QListView
、QLineEdit
和水平布局(包含按钮)。
-
控件(Widgets):
QWidget
: 所有用户界面对象的基类。QApplication
: 管理应用程序级别的资源,如初始化GUI环境。QListView
: 一个视图组件,用于显示QStandardItemModel
中的数据。QStandardItemModel
: 一个提供标准项模型的类,用于存储和管理数据。QStandardItem
: 一个标准的数据项,用于QStandardItemModel
。QLineEdit
: 一个单行文本输入框,用户可以在其中输入文本。QPushButton
: 一个按钮,用户可以点击它执行某个动作。
关键语句的解释:
self.setWindowTitle("QListView测试")
: 设置窗口的标题为"QListView测试"。self.resize(200,200)
: 设置窗口的大小为200x200像素。self.mode = QStandardItemModel(4,1)
: 创建一个4行1列的QStandardItemModel
。item = QStandardItem(self.list[i])
: 创建一个QStandardItem
,并用列表中的元素初始化它。self.mode.setItem(i,0,item)
: 将QStandardItem
设置到模型的指定位置。self.mode.insertRow(4, QStandardItem("数据结构"))
: 在模型的第5行插入一个新的QStandardItem
,内容为"数据结构"。self.listview.setModel(self.mode)
: 将模型设置为QListView
的数据源。self.addPb = QPushButton("增加项",clicked= self.addItem)
: 创建一个按钮,并将其点击事件连接到addItem
函数。self.delPb = QPushButton("删除项",clicked= self.delItem)
: 创建一个删除按钮,连接其点击事件到delItem
函数。self.sortPb = QPushButton("项目排序",clicked= self.sortItem)
: 创建一个排序按钮,连接其点击事件到sortItem
函数。self.vLayout.addWidget(self.listview)
: 将QListView
添加到垂直布局中。self.vLayout.addWidget(self.le)
: 将QLineEdit
添加到垂直布局中。self.vLayout.addLayout(hLayout)
: 将包含按钮的水平布局添加到垂直布局中。
addItem
, delItem
, 和 sortItem
函数分别用于向模型中添加新的项、删除最后一个项和对模型中的项进行排序。这些函数通过按钮的点击事件触发。
整体来说,这段代码的功能是创建一个窗口,窗口中包含一个显示编程语言的列表视图,以及用于添加、删除和排序列表项的按钮。用户可以通过QLineEdit
输入新的项,然后点击"增加项"按钮将其添加到列表中;可以点击"删除项"按钮删除最后一个列表项;可以点击"项目排序"按钮对列表项进行排序。
2. 列表框:QListWidet
列表框属于QListWidet 类,是一个基于条目的接口,用于从列表中添加或删除条目。列表中的每个条目都是一个 QListWidgetItem 对象。可以设置为多重选择。它的常用方法如表。
addItem():在列表中添加QListWidgetItem对象或字符串
addItems():添加列表中的每个条目
insertItem():在指定的索引处插入条目
clear():删除列表的内容
setCurrentItem():设置当前所选条目
sortItems():按升序重新排列条目
QListWidget类中的常用信号如下:
currentItemChanged(cItem, pItem):当列表中的条目发生改变时发送 cItem:表示当前选择项 pItem:在此之前的选择项。
currentRowChanged(row):当列表部件中的当前项发生变化时发送 row当前项行号,如果没有当前项,其值为-1
currentTextChanged(text):当列表部件中的当前项发生变化时发送 text为当前项对应文本。
itemChanged(item):文本无论是否真正改变,当项的文本发生改变时发送
itemClicked(item):当部件中的项被鼠标单击时发送
itemDoubleClicked(item):当部件中的项被鼠标双击时发送
itemEntered(item):当部件中的项接收到鼠标光标时发送 设置mouseTracking属性为True发送,否则只有鼠标移动到项时按下按键时才发送。
itemPressed(item):当鼠标在部件中的项上按下时发送
itemSelectionChanged():无论选中项是否改变,当列表中进行了选择操作后发送
【例4.10】QListWidet列表框测试。将文本框中输入的内容作为列表框的项目。测试如下:
import sys # 导入sys模块,用于处理Python解释器与脚本之间的交互,例如获取命令行参数。
from PyQt6.QtCore import * # 从PyQt6的QtCore模块中导入所有类和函数。
from PyQt6.QtGui import * # 从PyQt6的QtGui模块中导入所有类和函数。
from PyQt6.QtWidgets import * # 从PyQt6的QtWidgets模块中导入所有类和函数。
class ListWidget(QListWidget): # 定义一个名为ListWidget的新类,它继承自QListWidget。
def clicked(self, item): # 在ListWidget类中定义一个名为clicked的方法,当某个项目被点击时调用。
QMessageBox.information(self, "ListWidget", "你选择了: " + item.text()) # 弹出一个信息对话框,显示被点击的项目的文本。
if __name__ == '__main__': # 检查当前脚本是否是作为主程序运行。
app = QApplication(sys.argv) # 创建一个QApplication对象,这是PyQt6应用程序的入口点。
listWidget = ListWidget() # 创建一个ListWidget对象,这是自定义的QListWidget。
listWidget.resize(300, 120) # 调整ListWidget的大小为300x120像素。
listWidget.addItem("Item 1") # 向ListWidget中添加一个文本为"Item 1"的项目。
listWidget.addItem("Item 2") # 向ListWidget中添加一个文本为"Item 2"的项目。
listWidget.addItem("Item 3") # 向ListWidget中添加一个文本为"Item 3"的项目。
listWidget.addItem("Item 4") # 向ListWidget中添加一个文本为"Item 4"的项目。
listWidget.setWindowTitle('QListwidget 例子') # 设置ListWidget的窗口标题为'QListwidget 例子'。
listWidget.itemClicked.connect(listWidget.clicked) # 当ListWidget中的某个项目被点击时,连接其itemClicked信号到自定义的clicked方法。
listWidget.show() # 显示ListWidget窗口。
sys.exit(app.exec()) # 进入Qt应用程序的主循环,等待用户交互。当应用程序结束时,通过sys.exit退出Python解释器。
这段代码主要实现了一个简单的图形用户界面(GUI)应用程序,该应用程序使用QListWidget
控件来显示一个列表,并在用户点击列表中的某个项目时弹出一个信息对话框。
使用的布局和控件:
-
布局:这段代码没有显式使用布局管理器。
QListWidget
自身就负责项目的布局,因此这里不需要额外的布局管理器。 -
控件:
QApplication
:应用程序的实例,负责初始化和管理Qt应用程序的控制流和主要设置。QListWidget
:这是一个列表控件,用于显示一系列的项目。QMessageBox
:用于显示标准对话框,这里用于显示信息对话框。
关键语句:
-
listWidget.addItem("Item 1")
:向QListWidget
中添加项目。这里添加了四个项目:"Item 1"、"Item 2"、"Item 3"和"Item 4"。 -
listWidget.setWindowTitle('QListwidget 例子')
:设置窗口的标题为"QListwidget 例子"。 -
listWidget.itemClicked.connect(listWidget.clicked)
:连接QListWidget
的itemClicked
信号到自定义的clicked
槽函数。这意味着每当用户点击列表中的一个项目时,clicked
函数就会被调用。 -
QMessageBox.information(self, "ListWidget", "你选择了: "+item.text())
:在clicked
函数中,显示一个信息对话框,告知用户他们选择了哪个项目。这里使用item.text()
来获取被点击项目的文本。 -
sys.exit(app.exec())
:启动Qt的事件循环,并等待用户交互。当应用程序关闭时,sys.exit
确保Python解释器也退出。
总结:这段代码创建了一个简单的窗口,窗口中有一个QListWidget
控件,用于显示四个项目。当用户点击其中一个项目时,会弹出一个信息对话框,告诉用户他们选择了哪个项目。这段代码没有使用任何布局管理器,因为QListWidget
本身就能管理项目的布局。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)