信号与槽

自定义信号

装饰器pyqtSlot()

利用pyqt自带的装饰器pyqtSlot可以很方便的连接默认的信号。
使用的时候,在槽函数前面加上@pyqtSlot()装饰器,此时有两个要求:

  1. 槽函数命名的格式一定是 on_组件名称_信号名。比如

    1. @pyqtSlot()
    2. def on_File_address_select_button_clicked(self):
    3. pass

    如果信号中带有参数,那么在装饰器的参数列表中加入相应的参数类型,函数的参数列表中加入相应的形参

  2. 发送信号的组件必须有相应的name才可以。

    画图

    QGraphicsView

    QGraphicsScene

    GUI组件使用

    QTableWidget

    如果在表格中使用复选框,可以使用 setCellWidget 方法,更好用一些,可以直接嵌入 QCheckBox 组件。

    1. checkBox = QCheckBox()
    2. self.all_checkboxes.append(checkBox)
    3. checkBox.stateChanged.connect(self.onStateChanged)
    4. checkBox.setCheckState(PyQt5.QtCore.Qt.Checked)
    5. 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也不能使用

  1. QAction是一个可以用来出发某一种动作的组件。它继承的是QObject,不是一个widget,因此是没有各种Event的监听函数的。<br />QAction可以设置`icon`以及`Text`,同时还有一个函数叫做`setMenu(QMenu)`。这个函数可以让我们在工具栏中实现二级菜单。
  2. ```python
  3. self.opendir_action = QtWidgets.QAction(self)
  4. opendir_icon = QtGui.QIcon()
  5. opendir_icon.addPixmap(QtGui.QPixmap('icons/open.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off)
  6. self.opendir_action.setIcon(opendir_icon)
  7. self.opendir_action.setText('Open Dir')
  8. self.opendir_action.triggered.connect(self.on_opendir_action_triggered)
  9. self.opendir_action.setShortcut('Ctrl+O')
  10. self.opendir_action.setToolTip('HotKey: Ctrl+O')
  11. self.tool_bar.addAction(self.opendir_action)
  12. self.suction_cup_action.setMenu(suctioinToolsMenu())

QMenu可以被添加到QAction中,也就形成了二级菜单。QMenu中也可以添加新的QAction,然后就可以把这个菜单无限套娃。

  1. class suctioinToolsMenu(QtWidgets.QMenu):
  2. #TODO: define signals
  3. def __init__(self, parent = None):
  4. super(suctioinToolsMenu, self).__init__(parent=parent)
  5. # addAction只可以按照名字添加,不能按照直接传入QAction
  6. self.brush_action = self.addAction('brush')
  7. self.brush_action.triggered.connect(self.__on_brush_action_trigger)
  8. self.oval_action = self.addAction('oval')
  9. self.rect_action = self.addAction('rectangle')
  10. # addMenu
  11. self.addMenu(QMenu)
  12. def __on_brush_action_trigger(self):
  13. print('brush picked')