QListWidget 列表选择框
QListWidget 是 PyQt6 里的列表选择框控件,这篇教学会介绍如何在 PyQt6 窗口里加入 QListWidget 列表选择框,并简单介绍与 QListView 的差异,并实作修改样式以及点击选项等基本应用。
快速导览:
- QListWidget 和 QListView 的差异
- 加入 QListWidget 列表选择框
- QListWidget删除选项、添加选项、修改选项
- QListWidget 样式设定
- QListWidget 常用方法
- 显示 QListWidget 选择项目
QListWidget 和 QListView 的差异
QListWidget 是一个更新且更高级的控件,能够更为方便地进行开发,例如 QListWidget 具有 QStantandardItemModel 无法访问的类型,也能更轻松的透过 QListWidgetItem 处理数据,然而如果使用 QListView,许多方法必须要额外定义,属于比较旧的使用方式。
下方列出两个方法所建立简单列表选单的程序,可以看出使用 QListWidget 的程序更容易阅读理解:
from PyQt6 import QtWidgets, QtCore
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('千牛编程思维')
Form.resize(300, 200)
# 使用 QListView
listview = QtWidgets.QListView(Form)
listview.setGeometry(10,10,120,100)
model = QtCore.QStringListModel()
model.setStringList(['A','B','C','D']) # 使用 QtCore.QStringListModel() 建立选项
listview.setModel(model)
# 使用 QListWidget
listwidget = QtWidgets.QListWidget(Form)
listwidget.setGeometry(140,10,120,100)
listwidget.addItems(['A','B','C','D']) # 使用 addItems 建立选项
Form.show()
sys.exit(app.exec())
加入 QListWidget 列表选择框
建立 PyQt6 窗口物件后,透过 QtWidgets.QListWidget(widget)
方法,就能在指定的控件中建立列表选择框,接著使用 addItems()
方法加入列表项目,下方的程序执行后,会在窗口里加入一个有四个项目的列表选择框。
from PyQt6 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('千牛编程思维')
Form.resize(300, 200)
listwidget = QtWidgets.QListWidget(Form) # 建立列表選擇框控件
listwidget.addItems(['A','B','C','D']) # 建立选项
listwidget.setGeometry(10,10,120,100) # 设定位置
Form.show()
sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('千牛编程思维')
self.resize(300, 200)
self.ui()
def ui(self):
self.listwidget = QtWidgets.QListWidget(self) # 建立列表選擇框控件
self.listwidget.addItems(['A','B','C','D']) # 建立选项
self.listwidget.setGeometry(10,10,120,100) # 设定位置
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
QListWidget 删除选项
使用使用takeItem(index)
取得指定的项目,index 表示该项目的索引值,第一个项目为 0,取得项目后,就能透过removeItemWidge(item)
方法移除该项目,下方的程序执行后,会将项目里的 B 移除。
from PyQt6 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('千牛编程思维')
Form.resize(300, 200)
listwidget = QtWidgets.QListWidget(Form)
listwidget.addItems(['A','B','C','D'])
listwidget.setGeometry(10,10,120,100)
item = listwidget.takeItem(1) # 取得第二个项目,也就是 B
listwidget.removeItemWidget(item) # 移除第二个项目
Form.show()
sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('千牛编程思维')
self.resize(300, 200)
self.ui()
def ui(self):
self.listwidget = QtWidgets.QListWidget(self)
self.listwidget.addItems(['A','B','C','D'])
self.listwidget.setGeometry(10,10,120,100)
item = self.listwidget.takeItem(1) # 取得第二个项目,也就是 B
self.listwidget.removeItemWidget(item) # 移除第二个项目
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
QListWidget添加选项
有两种方法可以「添加列表项目」,第一种方法使用 addItem(item)
方法将项目加在列表最后方,第二种方法使用insertItem(index, item)
将项目加入指定的位置,两种方法除了可以单纯加入「文字」项目,也可以使用函数的方法,加入带有 icon 图示的项目。
下面的程序执行后,会先使用第一种方法,在最后方添加一个内容为 X 的项目,并搭配函数在最后加入一个带有 icon 图片的选项,接著会使用第二种方法,将内容为 Y 的项目添加在第一个项目,然后再搭配函数在第一个项目加入带有 icon 图片的选项。
from PyQt6 import QtWidgets, QtGui
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('千牛编程思维')
Form.resize(300, 200)
def create_item(text, img):
item = QtWidgets.QListWidgetItem() # 建立清单項目
item.setText(text) # 項目文字
item.setIcon(QtGui.QIcon(img)) # 項目图片
return item # 返回清单項目
listwidget = QtWidgets.QListWidget(Form)
listwidget.addItems(['A','B','C','D'])
listwidget.setGeometry(10,10,120,120)
listwidget.addItem('X') # 添加純文字項目
listwidget.addItem(create_item('', 'icon.png')) # 添加使用函数創造的选项
listwidget.insertItem(0, 'Y') # 添加純文字項目
listwidget.insertItem(0, create_item('', 'icon2.png')) # 添加使用函数創造的选项
Form.show()
sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets, QtGui
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('千牛编程思维')
self.resize(300, 200)
self.ui()
def ui(self):
self.listwidget = QtWidgets.QListWidget(self)
self.listwidget.addItems(['A','B','C','D'])
self.listwidget.setGeometry(20,20,320,320)
self.listwidget.addItem('X') # 添加純文字項目
self.listwidget.addItem(self.create_item('', 'icon.png')) # 添加使用函数創造的选项
self.listwidget.insertItem(0, 'Y') # 添加純文字項目
self.listwidget.insertItem(0, self.create_item('', 'icon2.png')) # 添加使用函数創造的选项
def create_item(self, text, img):
item = QtWidgets.QListWidgetItem() # 建立清单項目
item.setText(text) # 項目文字
item.setIcon(QtGui.QIcon(img)) # 項目图片
return item # 返回清单項目
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
QListWidget 修改选项
如果要修改项目内容,可以先透过item(index)
方法可以取得该项目,接著就能使用setText()
方法修改文字,使用setIcon()
方法设定图示。
from PyQt6 import QtWidgets, QtGui
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('千牛编程思维')
Form.resize(300, 200)
listwidget = QtWidgets.QListWidget(Form)
listwidget.addItems(['A','B','C','D'])
listwidget.setGeometry(10,10,120,100)
item = listwidget.item(1) # 取得第二个项目 ( 第一個为 0 )
item.setText('ok') # 设定文字为 ok
item.setIcon(QtGui.QIcon('icon.png')) # 设定 icon
Form.show()
sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets, QtGui
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('千牛编程思维')
self.resize(300, 200)
self.ui()
def ui(self):
self.listwidget = QtWidgets.QListWidget(self)
self.listwidget.addItems(['A','B','C','D'])
self.listwidget.setGeometry(10,10,120,100)
item = self.listwidget.item(1) # 取得第二个项目 ( 第一個为 0 )
item.setText('ok') # 设定文字为 ok
item.setIcon(QtGui.QIcon('icon.png')) # 设定 icon
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
QListWidget 样式设定
透过setStyleSheet()
,可以使用类似网页的 CSS 语法设定 QPushButton 样式,搭配 setFlow()
方法,也可以设定列表为水平显示或垂直显示 ( QtWidgets.QListView.Flow.LeftToRight
为 PyQt6 的用法 ),下方的程序执行后,会将原本垂直显示列表换成水平显示,并在选择项目时,将项目变成黑底红字。
from PyQt6 import QtWidgets, QtGui
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('千牛编程思维')
Form.resize(300, 200)
def show():
print(listwidget.currentItem().text(), listwidget.currentIndex().row())
def create_item(text):
item = QtWidgets.QListWidgetItem(listwidget)
item.setText(text)
item.setIcon(QtGui.QIcon('icon.png'))
return item
listwidget = QtWidgets.QListWidget(Form)
listwidget.addItems(['A','B','C','D'])
listwidget.setGeometry(10,10,200,50)
listwidget.addItem(create_item(''))
listwidget.setFlow(QtWidgets.QListView.Flow.LeftToRight) # 改成水平显示
listwidget.setStyleSheet('''
QListWidget{
color:#00f;
}
QListWidget::item{
width:30px;
}
QListWidget::item:selected{
color:#f00;
background:#000;
}
''')
Form.show()
sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets, QtGui
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('千牛编程思维')
self.resize(300, 200)
self.ui()
def ui(self):
self.listwidget = QtWidgets.QListWidget(self)
self.listwidget.addItems(['A','B','C','D'])
self.listwidget.setGeometry(10,10,200,50)
self.listwidget.addItem(self.create_item(''))
self.listwidget.setFlow(QtWidgets.QListView.Flow.LeftToRight) # 改成水平显示
self.listwidget.setStyleSheet('''
QListWidget{
color:#00f;
}
QListWidget::item{
width:30px;
}
QListWidget::item:selected{
color:#f00;
background:#000;
}
''')
def create_item(self, text):
item = QtWidgets.QListWidgetItem(self.listwidget)
item.setText(text)
item.setIcon(QtGui.QIcon('icon.png'))
return item
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
QListWidget 常用方法
下方列出 QListWidget 的常用方法:
方法 | 参数 | 说明 |
---|---|---|
item() | index | 取得指定的项目。 |
addItem() | str | 增加单一个项目。 |
addItems() | list | 以串列方式增加多个项目。 |
takeItem() | index | 取得並移除指定項目 |
removeItemWidget() | item | 移除指定項目。 |
clear() | 清空所有项目。 | |
setFlow() | type | 设定排列方式,预设QtWidgets.QListView.Flow.TopToBottom 从上而下,QtWidgets.QListView.Flow.LeftToRight 从左到右 ( 和 PyQt5 不同 )。 |
setDisabled() | bool | 设定是否禁用,预设 False。 |
clicked.connect() | fn | 点击项目时时要执行的函数。 |
text() | 取得输入框内容。 | |
currentItem().text() | 点击项目的文字。 | |
currentIndex().row() | 点击项目的列数 ( 垂直 )。 | |
currentIndex().column() | 点击项目的栏数 ( 水平 )。 |
下方列出 QListWidget 里 item 的常用方法:
方法 | 参数 | 说明 |
---|---|---|
setText() | str | 设定项目的文字内容。 |
setIcon() | QtGui.QIcon(path) | 设定项目的图片。 |
setSelected() | bool | 设定是否选取,预设 False。 |
text() | 项目的文字内容。 |
显示 QListWidget 选择项目
运用clicked.connect(fn)
方法,就能在点击项目时,执行特定的函数,下方的程序执行后,会透过 QLabel 显示点击的项目内容。
from PyQt6 import QtWidgets, QtCore, QtGui
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('千牛编程思维')
Form.resize(300, 200)
label = QtWidgets.QLabel(Form)
label.setGeometry(10,10,120,30)
def show():
text = listwidget.currentItem().text() # 取得項目文字
num = listwidget.currentIndex().row() # 取得項目编号
label.setText(f'{num}:{text}') # 显示文字
listwidget = QtWidgets.QListWidget(Form)
listwidget.addItems(['A','B','C','D'])
listwidget.setGeometry(10,50,120,50)
listwidget.setFlow(QtWidgets.QListView.Flow.LeftToRight)
listwidget.setStyleSheet('''
QListWidget::item{
font-size:20px;
}
QListWidget::item:selected{
color:#f00;
background:#000;
}
''')
listwidget.clicked.connect(show) # 点击项目时执行函数
Form.show()
sys.exit(app.exec())
class 写法 ( 注意不能使用 show 作为方法名称,会覆写基类的 show 方法造成无法显示 ):
from PyQt6 import QtWidgets, QtGui
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('千牛编程思维')
self.resize(300, 200)
self.ui()
def ui(self):
self.label = QtWidgets.QLabel(self)
self.label.setGeometry(10,10,120,30)
self.listwidget = QtWidgets.QListWidget(self)
self.listwidget.addItems(['A','B','C','D'])
self.listwidget.setGeometry(10,50,120,50)
self.listwidget.setFlow(QtWidgets.QListView.Flow.LeftToRight)
self.listwidget.setStyleSheet('''
QListWidget::item{
font-size:20px;
}
QListWidget::item:selected{
color:#f00;
background:#000;
}
''')
self.listwidget.clicked.connect(self.showText) # 点击项目时执行函数
def showText(self):
text = self.listwidget.currentItem().text() # 取得項目文字
num = self.listwidget.currentIndex().row() # 取得項目编号
self.label.setText(f'{num}:{text}') # 显示文字
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())