问题描述
我正在尝试开发一个包含许多自定义小部件的程序。在我的窗口小部件中,我有一个十字准线鼠标指针,当我在其中一个窗口小部件中移动它时,所有这些元素都必须感知到它,并且十字准线必须对每个单个窗口小部件做出反应。 在paintEnent函数的末尾有一个self.update()。
-
如何强制应用程序上的其他小部件做出反应?
-
paintEvent不是像这样的简单代码,因为我在此部分添加了每个函数,所以它占用了很高的cpu使用率。我该如何管理?
import sys from PyQt5.QtWidgets import QApplication,QDialog,QListWidget,QComboBox,QVBoxLayout,QPushButton,QLabel,QMainWindow,QWidget,QHBoxLayout,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,painter.device().width(),painter.device().height()) painter.fillRect(rect,brush) pen.setColor(QColor('blue')) painter.setPen(pen) painter.drawLine(self.x,self.x,painter.device().height()) #V painter.drawLine(0,self.y,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) 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_()
解决方法
IV找到了方法! 我使用信号和插槽在实例之间进行通信
也可能对其他人有用:)
import sys
from PyQt5.QtWidgets import QApplication,QDialog,QListWidget,QComboBox,QVBoxLayout,QPushButton,QLabel,QMainWindow,QWidget,QHBoxLayout,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,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,Qt.SolidLine))
painter.drawText(5,15,FxMainForm.studyItem[0]+' ('+FxMainForm.studyItem[1]+') ')
Boom.xPos=self.x/self.width()
else:
painter.setPen(QPen(Qt.red,Qt.SolidLine))
painter.drawLine(int(Boom.xPos*painter.device().width()),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)
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_()