微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我的自定义窗口小部件在其他会话上对我的paintEvent没有反应

如何解决我的自定义窗口小部件在其他会话上对我的paintEvent没有反应

我正在尝试开发一个包含许多自定义小部件的程序。在我的窗口小部件中,我有一个十字准线鼠标指针,当我在其中一个窗口小部件中移动它时,所有这些元素都必须感知到它,并且十字准线必须对每个单个窗口小部件做出反应。 在paintEnent函数的末尾有一个self.update()。

  1. 如何强制应用程序上的其他小部件做出反应?

  2. 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_()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。