信号与槽
自定义信号
装饰器pyqtSlot()
利用pyqt自带的装饰器pyqtSlot可以很方便的连接默认的信号。
使用的时候,在槽函数前面加上@pyqtSlot()装饰器,此时有两个要求:
槽函数命名的格式一定是
on_组件名称_信号名。比如@pyqtSlot()def on_File_address_select_button_clicked(self):pass
如果信号中带有参数,那么在装饰器的参数列表中加入相应的参数类型,函数的参数列表中加入相应的形参
-
画图
QGraphicsView
QGraphicsScene
GUI组件使用
QTableWidget
如果在表格中使用复选框,可以使用
setCellWidget方法,更好用一些,可以直接嵌入QCheckBox组件。checkBox = QCheckBox()self.all_checkboxes.append(checkBox)checkBox.stateChanged.connect(self.onStateChanged)checkBox.setCheckState(PyQt5.QtCore.Qt.Checked)self.__ui.tableWidget.setCellWidget(row_idx+1, 3, checkBox)
需要注意的是,标题中,没有相应的方法可以嵌入复选框,也就是说没有办法从标题栏直接全选。网上给出了一种自定义标题栏的方法,不过看起来很麻烦。目前最简单的解决方法是使用
setVisible(False)来先隐藏标题栏,然后把第一行当作HorizontalHead。QMenu, QAction, QToolBar
这三个组件都是在
QWidget里面的
QToolBar是一个用来存放widgets或者QAction的地方,可以在四个方向停靠 ```python self.tool_bar = QtWidgets.QToolBar(self) self.tool_bar.setMouseTracking(True) # 设置鼠标监听 self.tool_bar.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) # 设置toolbox中的action格式 self.addToolBar(QtCore.Qt.LeftToolBarArea, self.tool_bar) # 设置停靠在哪个地方
self.tool_bar.addAction(self.opendir_action) # QAction必须要加入才能够真正注册,即使设置过全局快捷键,不add也不能使用
QAction是一个可以用来出发某一种动作的组件。它继承的是QObject,不是一个widget,因此是没有各种Event的监听函数的。<br />QAction可以设置`icon`以及`Text`,同时还有一个函数叫做`setMenu(QMenu)`。这个函数可以让我们在工具栏中实现二级菜单。```pythonself.opendir_action = QtWidgets.QAction(self)opendir_icon = QtGui.QIcon()opendir_icon.addPixmap(QtGui.QPixmap('icons/open.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off)self.opendir_action.setIcon(opendir_icon)self.opendir_action.setText('Open Dir')self.opendir_action.triggered.connect(self.on_opendir_action_triggered)self.opendir_action.setShortcut('Ctrl+O')self.opendir_action.setToolTip('HotKey: Ctrl+O')self.tool_bar.addAction(self.opendir_action)self.suction_cup_action.setMenu(suctioinToolsMenu())
QMenu可以被添加到QAction中,也就形成了二级菜单。QMenu中也可以添加新的QAction,然后就可以把这个菜单无限套娃。
class suctioinToolsMenu(QtWidgets.QMenu):#TODO: define signalsdef __init__(self, parent = None):super(suctioinToolsMenu, self).__init__(parent=parent)# addAction只可以按照名字添加,不能按照直接传入QActionself.brush_action = self.addAction('brush')self.brush_action.triggered.connect(self.__on_brush_action_trigger)self.oval_action = self.addAction('oval')self.rect_action = self.addAction('rectangle')# addMenuself.addMenu(QMenu)def __on_brush_action_trigger(self):print('brush picked')
