zoukankan      html  css  js  c++  java
  • ZetCode PyQt4 tutorial custom widget

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    """
    ZetCode PyQt4 tutorial 
    
    In this example, we create a custom widget.
    
    author: Jan Bodnar
    website: zetcode.com 
    last edited: October 2011
    """
    
    import sys
    from PyQt4 import QtGui, QtCore
    
    
    class Communicate(QtCore.QObject):
        
        updateBW = QtCore.pyqtSignal(int)
    
    
    # The burning widget it based on the QtGui.QWidget widget.
    class BurningWidget(QtGui.QWidget):
      
        def __init__(self):      
            super(BurningWidget, self).__init__()
            
            self.initUI()
            
        def initUI(self):
            
            # We change the minimum size (height) of the widget. The default value is a bit small for us.
            self.setMinimumSize(1, 30)
            self.value = 75
            self.num = [75, 150, 225, 300, 375, 450, 525, 600, 675]
    
    
        def setValue(self, value):
    
            self.value = value
    
    
        def paintEvent(self, e):
          
            qp = QtGui.QPainter()
            qp.begin(self)
            self.drawWidget(qp)
            qp.end()
          
          
        def drawWidget(self, qp):
          
            # We use a smaller font than the default one. This better suits our needs.
            font = QtGui.QFont('Serif', 7, QtGui.QFont.Light)
            qp.setFont(font)
    
            # We draw the widget dynamically. The greater is the window, the greater is the burning widget and vice versa. That is why we must calculate the size of the widget onto which we draw the custom widget. The till parameter determines the total size to be drawn. This value comes from the slider widget. It is a proportion of the whole area. The full parameter determines the point where we begin to draw in red colour. Notice the use of floating point arithmetics to achieve greater precision in drawing.
            # The actual drawing consists of three steps. We draw the yellow or the red and yellow rectangle. Then we draw the vertical lines which divide the widget into several parts. Finally, we draw the numbers which indicate the capacity of the medium.
            size = self.size()
            w = size.width()
            h = size.height()
    
            step = int(round(w / 10.0))
    
            till = int(((w / 750.0) * self.value))
            full = int(((w / 750.0) * 700))
    
            if self.value >= 700:
            
                qp.setPen(QtGui.QColor(255, 255, 255))
                qp.setBrush(QtGui.QColor(255, 255, 184))
                qp.drawRect(0, 0, full, h)
                qp.setPen(QtGui.QColor(255, 175, 175))
                qp.setBrush(QtGui.QColor(255, 175, 175))
                qp.drawRect(full, 0, till-full, h)
                
            else:
                qp.setPen(QtGui.QColor(255, 255, 255))
                qp.setBrush(QtGui.QColor(255, 255, 184))
                qp.drawRect(0, 0, till, h)
    
    
            pen = QtGui.QPen(QtGui.QColor(20, 20, 20), 1, 
                QtCore.Qt.SolidLine)
                
            qp.setPen(pen)
            qp.setBrush(QtCore.Qt.NoBrush)
            qp.drawRect(0, 0, w-1, h-1)
    
            j = 0
    
            for i in range(step, 10*step, step):
              
                qp.drawLine(i, 0, i, 5)
                # We use font metrics to draw the text. We must know the width of the text in order to center it around the vertical line.
                metrics = qp.fontMetrics()
                fw = metrics.width(str(self.num[j]))
                qp.drawText(i-fw/2, h/2, str(self.num[j]))
                j = j + 1
                
    
    class Example(QtGui.QWidget):
        
        def __init__(self):
            super(Example, self).__init__()
            
            self.initUI()
            
        def initUI(self):      
    
            sld = QtGui.QSlider(QtCore.Qt.Horizontal, self)
            sld.setFocusPolicy(QtCore.Qt.NoFocus)
            sld.setRange(1, 750)
            sld.setValue(75)
            sld.setGeometry(30, 40, 150, 30)
    
            self.c = Communicate()        
            self.wid = BurningWidget()
            self.c.updateBW[int].connect(self.wid.setValue)
    
            sld.valueChanged[int].connect(self.changeValue)
            hbox = QtGui.QHBoxLayout()
            hbox.addWidget(self.wid)
            vbox = QtGui.QVBoxLayout()
            vbox.addStretch(1)
            vbox.addLayout(hbox)
            self.setLayout(vbox)
            
            self.setGeometry(300, 300, 390, 210)
            self.setWindowTitle('Burning widget')
            self.show()
            
        # When we move the slider, the changeValue() method is called. Inside the method, we send a custom updateBW signal with a parameter. The parameter is the current value of the slider. The value is later used to calculate the capacity of the Burning widget to be drawn. The custom widget is then repainted.
        def changeValue(self, value):
                 
            self.c.updateBW.emit(value)        
            self.wid.repaint()
            
            
    def main():
        
        app = QtGui.QApplication(sys.argv)
        ex = Example()
        sys.exit(app.exec_())
    
    
    if __name__ == '__main__':
        main()
  • 相关阅读:
    VTK 空间几何变换(Transform),平移、旋转和缩放
    VTK 对象绘制 3D坐标轴(vtkCubeAxesActor)
    VTK 颜色映射之颜色插值
    VTK 模型的颜色映射
    VTK 如何不使用qvtkwidget,而直接把vtk出口嵌入qt窗口中
    VTK vtkRenderWindow 与vtkRenderWindowInteractor详解
    Qt 将界面程序封装成动态库DLL
    Qt 界面做成dll以便调用
    Qt 将带界面的程序封装成dll
    Qt 开发的界面程序封装成DLL,在VC中成功调用
  • 原文地址:https://www.cnblogs.com/zengjfgit/p/4851904.html
Copyright © 2011-2022 走看看