信号与槽
自定义信号
装饰器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)`。这个函数可以让我们在工具栏中实现二级菜单。
```python
self.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 signals
def __init__(self, parent = None):
super(suctioinToolsMenu, self).__init__(parent=parent)
# addAction只可以按照名字添加,不能按照直接传入QAction
self.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')
# addMenu
self.addMenu(QMenu)
def __on_brush_action_trigger(self):
print('brush picked')