PySide——Python图形化界面入门教程(五)
PySide——Python图形化界面入门教程(五)
——QListWidget
翻译自:http://pythoncentral.io/pyside-pyqt-tutorial-the-qlistwidget/
Qt具有简洁和方便的几个部件,用来作单列表选择,我们称之为列表框。最灵活的方法是使用一个是Qlistview,它提供了一个必须由程序员定义UI视图、高度灵活的列表模式;一个简单的方法是使用QListWidget,它具有一个预先定义的基于项目的模型,用来处理常见的列表框。我们本节从简单的QListWidget开始。
QListWidget
QListWidget的构造器同许多QWidget的子类一样,拥有一个可选的parent参数:
self.list = QListWidget(self)
填充QListWidget
为QListWidget添加项目非常容易。如果项目是纯文本,你可以单独的添加他们:
1 for i in range(10): 2 self.list.addItem('Item %s' % (i + 1))
或者一起添加他们:
1 items = ['Item %s' % (i + 1) 2 for i in range(10)] 3 self.list.addItems(items)
你还可以使用QListWidgetItem类更复杂的列表项目。QListWidgetItem可以被单独的创建,然后再使用列表的addItem方法添加。
item = QListWidgetItem()
list.addItem(item)
更复杂的QListWidget项目
或者,它还可以直接使用list参数来创建,这样他会自动的被添加到list。
item = QListWidgetItem(list)
项目可以使用setText方法来添加文本,使用setIcon方法添加图标QIcon:
item.setText('I am an item')
item.setIcon(some_QIcon)
同样也可以在构造器中写明文本或图标:
item = QListWidgetItem('A Text-Only Item') item = QListWidgetItem(some_QIcon, 'An item with text and an icon')
当然, 上面的每个构造器也可选的接受parent参数。
使用QListWidget
QListWidget提供一些方便的信号来响应用户输入。最重要的是currentItemChanged信号,它是当用户改变选择的项目时发出;它连接的槽接收两个参数,current和previous,表示现在和之前选择的QListWidgetItem项。同样它也有对应的信号,当用户单击、双击、激活或按下一个项、改变选择的项目集时。
为获得当前选择的项,你也可以使用currentItemChanged信号传来的参数,或使用QListWidget的currentItem方法。
对QIcon的注解
你可以通过添加一个图标来改变QListWidgetItem,所以有必要了解一下QIcon了。这有许多构造QIcon的方法,如:
- 提供文件名:
icon = QIcon('/some/path/to/icon.png')
. - 使用主题图标:
icon = QIcon.fromTheme('document-open')
. - 通过
QPixMap
:icon = QIcon(some_pixmap)
还有许多其他的。注意:基于文件的创建方法支持许多类型,但并不是所有类型,你可以通过使用QImageReader().supportedImageFormats()
来查看你的平台和版本支持哪些。在作者的系统上,它返回了:
1 [PySide.QtCore.QByteArray('bmp'), 2 PySide.QtCore.QByteArray('gif'), 3 PySide.QtCore.QByteArray('ico'), 4 PySide.QtCore.QByteArray('jpeg'), 5 PySide.QtCore.QByteArray('jpg'), 6 PySide.QtCore.QByteArray('mng'), 7 PySide.QtCore.QByteArray('pbm'), 8 PySide.QtCore.QByteArray('pgm'), 9 PySide.QtCore.QByteArray('png'), 10 PySide.QtCore.QByteArray('ppm'), 11 PySide.QtCore.QByteArray('svg'), 12 PySide.QtCore.QByteArray('svgz'), 13 PySide.QtCore.QByteArray('tga'), 14 PySide.QtCore.QByteArray('tif'), 15 PySide.QtCore.QByteArray('tiff'), 16 PySide.QtCore.QByteArray('xbm'),
基于主题的创建方法有时候会出问题,当在Windows和OS X还有使用Gnome或KDE的Linux应该没问题,但是如果使用不太常见的桌面环境,像OpenBox或XFCE,Qt或许不能找到你的图标,所以会只有文本。
一个QListWidget例子
我们来创建一个简单的列表widget来显示文件夹中的文件名和为图片显示一个极小的图标。因为这里的项非常简单,足以用QListWidgetItem来创建,我们将从QListWidget继承。
第一步,我们需要知道安装的版本都支持什么类型的图片,这样我们的列表控件才能辨别什么是合法的图片。我们可以使用上面提到的方法,QImageReader().supportedImageFormats()。我们将他们返回前全部转化成字符串:
1 def supported_image_extensions(): 2 ''' Get the image file extensions that can be read. ''' 3 formats = QImageReader().supportedImageFormats() 4 # Convert the QByteArrays to strings 5 return [str(fmt) for fmt in formats]
现在我们可以创建我们的图片列表widget了,起一个望名知义的名字——ImageFileWidget。它将继承自QListWidget,还像所有的QWidget一样有一个可选的parent参数,此外,它要求一个dirpath参数:
1 class ImageFileList(QListWidget): 2 ''' A specialized QListWidget that displays the list 3 of all image files in a given directory. ''' 4 def __init__(self, dirpath, parent=None): 5 QListWidget.__init__(self, parent)
我们需要知道给出的文件夹中都有哪些图片。这里给出一个_images方法,这个方法会返回指定目录中所有合法图片的文件名。它利用了glob模块的glob函数,它允许对文件和路径进行shell风格的模式匹配。
1 def _images(self): 2 ''' Return a list of file-names of all 3 supported images in self._dirpath. ''' 4 5 # Start with an empty list 6 images = [] 7 8 # Find the matching files for each valid 9 # extension and add them to the images list. 10 for extension in supported_image_extensions(): 11 pattern = os.path.join(self._dirpath, 12 '*.%s' % extension) 13 images.extend(glob(pattern)) 14 15 return images