python - 我的自定义小部件在其他会话上对我的paintEvent 没有反应
问题描述
我正在尝试开发一个包含许多我的自定义小部件的程序。在我的小部件中,我有一个十字准线鼠标指针,当我在其中一个小部件中移动它时,它们都必须感应到它,并且十字准线必须对每个小部件做出反应。我在 paintEnent 函数的末尾有一个 self.update() 。
如何强制我的应用程序上的其他小部件对其做出反应?
paintEvent 不是这样的简单代码,当我在这部分添加每个函数时,它会占用非常高的 CPU 使用率。我该如何管理它?
import sys from PyQt5.QtWidgets import QApplication, QDialog, QListWidget, QComboBox, QVBoxLayout, QPushButton, QLabel, QMainWindow, QWidget, QHBoxLayout, QVBoxLayout, QSizePolicy from PyQt5.QtCore import Qt, QSize, QRect from PyQt5.QtGui import QPalette, QColor, QPen, QPixmap, QPainter, QBrush class Boom(QWidget): xPos=-1.0 def __init__(self,bgColor,xSpace=1,ySpace=1): super().__init__() self.bgColor=bgColor self.x = -1 self.y = -1 self.setSizePolicy(QSizePolicy.MinimumExpanding,QSizePolicy.MinimumExpanding) self.setMouseTracking(True) layout = QVBoxLayout() self.setLayout(layout) def mouseMoveEvent(self, event): global xPos self.x = event.x() self.y = event.y() xPos=self.x/self.width() self.update() def paintEvent(self, e): painter = QPainter(self) font = painter.font() font.setFamily('Times') font.setPointSize(8) painter.setFont(font) brush = QBrush() brush.setColor(QColor(self.bgColor)) brush.setStyle(Qt.SolidPattern) pen = QPen() pen.setWidth(1) pen.setColor(QColor('black')) painter.setPen(pen) rect = QRect(0, 0, painter.device().width(), painter.device().height()) painter.fillRect(rect, brush) pen.setColor(QColor('blue')) painter.setPen(pen) painter.drawLine(self.x, 0, self.x,painter.device().height()) #V painter.drawLine(0, self.y, painter.device().width(),self.y) #H self.update() painter.end() class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle("Graph") MainPanelLayout = QHBoxLayout() MainPanelLayout.setContentsMargins(1,1,1,1) MainPanelLayout.setSpacing(1) B1=Boom('pink',0) B2=Boom('gray',1) MainPanelLayout.addWidget(B1) MainPanelLayout.addWidget(B2) widget = QWidget() widget.setLayout(MainPanelLayout) self.setCentralWidget(widget) if __name__ == "__main__": app = QApplication(sys.argv) mainWindow = MainWindow() mainWindow.show() # mainWindow.showMaximized() app.exec_()
解决方案
我找到了方法!我使用信号和插槽在实例之间进行通信
愿它也适用于其他人:)
import sys
from PyQt5.QtWidgets import QApplication, QDialog, QListWidget,QComboBox, QVBoxLayout, QPushButton, QLabel, QMainWindow,QWidget, QHBoxLayout, QVBoxLayout, QSizePolicy
from PyQt5.QtCore import Qt, QSize, QRect, QObject, pyqtSignal
from PyQt5.QtGui import QPalette, QColor, QPen, QPixmap, QPainter,QBrush
import FxMainForm
class BoomCommunicate(QObject):
signal = pyqtSignal()
class Boom(QWidget):
xPos=-1
def __init__(self,bgColor,nChannel=-1,xSpace=1,ySpace=1):
super().__init__()
self.bgColor=bgColor
self.xSpace=xSpace
self.ySpace=ySpace
self.x = -1
self.y = -1
self.nChannel=nChannel
self.setSizePolicy(QSizePolicy.MinimumExpanding,QSizePolicy.MinimumExpanding)
self.setMouseTracking(True)
self.layout = QVBoxLayout()
self.setLayout(self.layout)
self.communicate = BoomCommunicate()
self.communicate.signal.connect(self.trigger_refresh)
def mouseMoveEvent(self, event):
self.x = event.x()
self.y = event.y()
if self.nChannel==0:
Boom.xPos=self.x/self.width()
self.communicate.signal.emit()
def paintEvent(self, e):
painter = QPainter(self)
font = painter.font()
font.setFamily('Times')
font.setPointSize(8)
painter.setFont(font)
brush = QBrush()
brush.setColor(QColor(self.bgColor))
brush.setStyle(Qt.SolidPattern)
pen = QPen()
pen.setWidth(1)
pen.setColor(QColor('black'))
painter.setPen(pen)
## Border
rect = QRect(0, 0, painter.device().width(), painter.device().height())
painter.fillRect(rect, brush)
pen.setColor(QColor('blue'))
painter.setPen(pen)
# self.Drawings(painter,pen,brush)
if self.nChannel==0:
painter.setPen(QPen(Qt.red, 1, Qt.SolidLine))
painter.drawLine(self.x, self.ySpace, self.x,painter.device().height()-self.ySpace-1) ##V
painter.drawLine(self.xSpace, self.y, painter.device().width()-self.ySpace-1,self.y) ##H
if not FxMainForm.studyItem==None:
painter.setPen(QPen(Qt.black, 1, Qt.SolidLine))
painter.drawText(5, 15,FxMainForm.studyItem[0]+' ('+FxMainForm.studyItem[1]+') ')
Boom.xPos=self.x/self.width()
else:
painter.setPen(QPen(Qt.red, 1, Qt.SolidLine))
painter.drawLine(int(Boom.xPos*painter.device().width()), self.ySpace,int(Boom.xPos*painter.device().width()),painter.device().height()-self.ySpace-1)
painter.end()
def trigger_refresh(self):
self.update()
def sizeHint(self):
return QSize(100, 100)
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setWindowTitle("Graph-Boom")
self.MainPanelLayout = QHBoxLayout()
self.MainPanelLayout.setContentsMargins(1,1,1,1)
self.MainPanelLayout.setSpacing(1)
self.B1=Boom('pink',0)
self.B2=Boom('gray',1)
self.MainPanelLayout.addWidget(self.B1)
self.MainPanelLayout.addWidget(self.B2)
self.B1.communicate.signal.connect(self.B2.update)
self.widget = QWidget()
self.widget.setLayout(self.MainPanelLayout)
self.setCentralWidget(self.widget)
if __name__ == "__main__":
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
# mainWindow.showMaximized()
app.exec_()
推荐阅读
- python - 重构多个 if / elif 语句,包括不等式
- reactjs - RTL - 测试 expect(onChange).toHaveBeenCalledWith({ name, value }) 不工作
- sql - SQL Server:获取日期+过去2个财政年度的数据
- android - ConstraintLayout 的 ViewStub 膨胀
- python - 使用 apply 函数同时填充 2 列数据框
- python - 如何按每 n 行拆分文件?
- json - Hibernate:使用可序列化和瞬态哪个最佳实践?
- javascript - 等待解析 CSV 文件并生成对象
- django - 如何通过多级反向查找来获取对象
- javascript - 为编辑器保存块内容