pyqt5

毕业设计做个GUI界面,一开始用Matlab做,只显示5张图片,后来打算显示多一点,10张20张,用Matlab我就不知道怎么弄了。后来就换成了PyQt,这边写下这次做GUI时遇到的一些问题。

  1. 显示20张图片,用滚动条的形式,使用QlistWidget,参照pyqt QlistWidget 自定义设计一(静态设计)
  2. 水平布局QHBoxLayout,左右排列;垂直布局QVBoxLayout,上下排列。布局安排时间隔啥的,有addStretch,AlignCenter,setContentsMargins,setSpacing等等。
  3. QMainWindow不能设置布局管理,需要时借助QWidget:
     widget = QWidget()
     self.setCentralWidget(widget)
     ...
     widget.setLayout(layout)
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/usr/bin/env python3
"""
测试集数据,可以滑动显示20张图片
可以缩放,图片大小为50*100
"""
import sys
from PyQt5.QtWidgets import (QMainWindow, QApplication, qApp, QAction, QLabel,
QGroupBox, QHBoxLayout,QVBoxLayout, QWidget, QGridLayout,
QListWidgetItem, QFileDialog, QListWidget)
from PyQt5.QtGui import QPixmap, QIcon, QColor, QFont
from PyQt5.QtCore import QSize, Qt

class Example(QMainWindow):

def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
openimg = QAction('Open', self)
openimg.triggered.connect(self.showDialog)
matchimg = QAction('Match', self)
matchimg.triggered.connect(self.showResult)
exitAction = QAction('&Exit', self)
exitAction.triggered.connect(qApp.quit)

menubar = self.menuBar()
fileMenu = menubar.addMenu('选项')
fileMenu.addAction(openimg)
fileMenu.addAction(matchimg)
fileMenu.addAction(exitAction) #菜单“选项”下添加三个菜单项,有各自的触发事件

widget = QWidget()
self.setCentralWidget(widget) #这两行是由于QMainWindow不能使用布局,通过在
#QWidget下使用,并设置为CentralWidget
self.horizontalGroupBox = QGroupBox()
vbox = QVBoxLayout()

self.label = QLabel(self)
self.label.setFixedSize(64,128)
self.lbl = QLabel(self)

vbox.addStretch(6)
vbox.addWidget(self.label,alignment=Qt.AlignHCenter)
vbox.addStretch(1)
vbox.addWidget(self.lbl,alignment=Qt.AlignHCenter)
vbox.addStretch(6)
self.horizontalGroupBox.setLayout(vbox) #这边是两个label放在QGroupBox里面,
#并进行垂直布局,间隔6:1:6

self.list_widget = QListWidget(self)
self.list_widget.hide()

hbox = QHBoxLayout()
hbox.setContentsMargins(10,20,10,20) #设置距离边框的距离
hbox.addWidget(self.horizontalGroupBox)
hbox.setSpacing(30) #设置间距
hbox.addWidget(self.list_widget)
widget.setLayout(hbox) #对QGroupBox和QListWidget进行水平布局,放在QWidget里

self.setGeometry(200, 100, 500, 270)
self.setWindowTitle('行人重识别')
self.setWindowIcon(QIcon('E:/image/_20171121125611.png')) #设置图标
self.show()

def showDialog(self):
self.fname = QFileDialog.getOpenFileName(self, 'Open file', '/home')
pixmap = QPixmap(self.fname[0])
self.label.setPixmap(pixmap) #打开图片,并显示

def _setItem(self, pic_path):
item_widget = QListWidgetItem()
item_widget.setSizeHint(QSize(280, 100))
item_widget.setBackground(QColor(240,240,240))
self.list_widget.addItem(item_widget)
label = MyLable(pic_path)
self.list_widget.setItemWidget(item_widget, label)

def showResult(self):
for i in list(range(4)):
self._setItem(self.fname[0])
self.list_widget.show() #在滑动列表QListWidget中显示20张图片

self.lbl.setFont(QFont("黑体",10))
self.lbl.setText("总匹配数: 张"+'\n'+"正确显示: 张"+'\n'+"查全率:11.11%")

class MyLable(QWidget): #这边是定义滑动列表QListWidget中 要放置的每一个
def __init__(self, icon_path):
super().__init__()

self.lb_1 = QLabel()
self.lb_1.setFixedSize(50, 100)
pixMap = QPixmap(icon_path).scaled(50, 100)
self.lb_1.setPixmap(pixMap)
self.lb_2 = QLabel()
self.lb_2.setFixedSize(50, 100)
self.lb_2.setPixmap(pixMap)
self.lb_3 = QLabel()
self.lb_3.setFixedSize(50, 100)
self.lb_3.setPixmap(pixMap)
self.lb_4 = QLabel()
self.lb_4.setFixedSize(50, 100)
self.lb_4.setPixmap(pixMap)
self.lb_5 = QLabel()
self.lb_5.setFixedSize(50, 100)
self.lb_5.setPixmap(pixMap)
self.init_ui()

def init_ui(self):
grid = QGridLayout()
grid.addWidget(self.lb_1, 1, 0)
grid.addWidget(self.lb_2, 1, 1)
grid.addWidget(self.lb_3, 1, 2)
grid.addWidget(self.lb_4, 1, 3)
grid.addWidget(self.lb_5, 1, 4)
self.setLayout(grid)
self.resize(280, 100)

if __name__ == '__main__':

app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())