青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 41, 文章 - 8, 評論 - 8, 引用 - 0
數據加載中……

[Python][PyQt4]在 PyQt4 中定制組件

在 PyQt4 中定制組件

PyQt4 有豐富的組件。但是不可能提供所有的組件。PyQt4 中僅僅提供最常用的組件,像按鈕,文本框,滑塊等。如果我們需要特殊的組件,我們必須要自己創建。

自定制組件可以使用工具包畫制工具創建。有兩種可能,一個程序員可以修改或提升一個已存在的工具,或是從零開始創建。

Burning widget

這是一個組件,我們可以在 Nero,K3B 或其它 CD/DVD 刻錄軟件。

#!/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)
class BurningWidget(QtGui.QWidget):
    def __init__(self):
        super(BurningWidget, self).__init__()
        self.initUI()
    def initUI(self):
        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):
        font = QtGui.QFont('Serif', 7, QtGui.QFont.Light)
        qp.setFont(font)
        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)
            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()
    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()

在這個例子中,我們有一個 QtGui.QSlider 和一個自定制組件。滑塊控制了自定制組件。這個組件顯示一個媒介總的容量以及剩余的容量。這里最小的值是 1,最大是 750 。如果我們到達 700 ,我們開始畫紅色。這是用于指示過度燒制。

組件放在窗口的底部。這通過一個 QtGui.QHBoxLayoutQtGui.QVBoxLayout 實現。

class BurningWidget(QtGui.QWidget):
    def __init__(self):
        super(BurningWidget, self).__init__()

這個組件基于 QtGui.QWidget 組件。

self.setMinimumSize(1, 30)

我們更改了組件最小的大小(高度)。默認的值是一點點小。

font = QtGui.QFont('Serif', 7, QtGui.QFont.Light)
qp.setFont(font)

我們用小于默認的字體。這適合于我們的需要。

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))

我們動態地繪制組件。窗口越大,組件會越大。反之亦然。這就是為何我們要計算組件的大小。參數 till 決定了要畫多少。此值來自于滑塊組件。這是整個區域的部分值。參數 full 決定了什么時候開始繪制紅色部分。注意,此處使用了浮點運算,是為更高的精度。

真正繪制時包含三個部分。我們先繪制黃色或紅色和黃色的矩形。然后繪制垂直的線,主要用于分割組件。最后是繪制數字,用于指示媒介的大小。

metrics = qp.fontMetrics()
fw = metrics.width(str(self.num[j]))
qp.drawText(i-fw/2, h/2, str(self.num[j]))

我們使用字體度量來繪制文本。我們必須要知道文本的寬度來居中繪制。

def changeValue(self, value):
    self.c.updateBW.emit(value)
    self.wid.repaint()

我們移動滑塊時, changeValue() 方法就被調用了。在此方法內部,我們發送了自定義的 updateBW 信號,并且帶了一個參數。這個參數是當前滑塊的值。這個值用于計算在 Burning 這個組件中要繪制多少。自定義的組件然后被重繪。


本部分,我們創建了自己的組件。

posted on 2012-02-12 10:17 mirguest 閱讀(1230) 評論(0)  編輯 收藏 引用 所屬分類: Python

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美国产精品桃花| 夜夜精品视频一区二区| 亚洲国产成人porn| 亚洲高清成人| 欧美精品一区二区三区一线天视频 | 亚洲精品色图| 久久人人97超碰国产公开结果| 老司机午夜精品视频在线观看| 亚洲第一精品在线| 欧美日韩精品欧美日韩精品一 | 亚洲精品裸体| 久久免费观看视频| 欧美激情片在线观看| 亚洲免费精品| 激情成人综合| 欧美激情aⅴ一区二区三区| av不卡在线| 久久五月天婷婷| 麻豆国产精品va在线观看不卡| 久久午夜精品一区二区| 亚洲三级免费| 国产一区在线免费观看| 亚洲在线成人| 欧美成人午夜| 久久国产免费| 久久综合狠狠综合久久综青草| 另类春色校园亚洲| 99精品欧美一区二区三区综合在线 | 亚洲国语精品自产拍在线观看| 亚洲无限av看| 亚洲久久成人| 欧美日韩在线视频一区二区| 免费成人av资源网| 久久成人免费网| 9色porny自拍视频一区二区| 牛牛影视久久网| 午夜精品久久久久久99热软件| 欧美亚洲三区| 亚洲第一网站| 欧美另类极品videosbest最新版本 | 久久精品一区二区三区不卡牛牛| 国产在线欧美| 国产精品九九| 国产精品福利av| 亚洲国产成人不卡| 国产日产亚洲精品| 欧美黄色大片网站| 国产精品国产三级国产专区53| 亚洲人成网站精品片在线观看| 国产人久久人人人人爽| 国产精品麻豆成人av电影艾秋| 国产精品久久久久aaaa樱花| 亚洲午夜一区二区三区| 亚洲成色777777在线观看影院| 久久久久久久一区| 亚洲一区二区三区乱码aⅴ| 国产精品乱人伦一区二区| 亚洲精品综合| 国产精品嫩草99av在线| 欧美成人69av| 久久成人羞羞网站| 欧美国产一区视频在线观看| 亚洲区一区二区三区| 亚洲国产欧美在线| 亚洲欧美一区二区在线观看| 国产精品久久久久9999| 亚洲人成小说网站色在线| 亚洲三级网站| 亚洲一区激情| 久久一区亚洲| 欧美视频不卡中文| 国产精品久久久久久久久借妻| 久久爱www.| 性娇小13――14欧美| 欧美中文在线视频| 欧美日韩一区二区在线视频| 国产噜噜噜噜噜久久久久久久久 | 欧美+亚洲+精品+三区| 久久综合伊人| 亚洲激情精品| 91久久午夜| 午夜精品久久久久久久久久久久久 | 亚洲欧美日韩精品久久久久| 久久理论片午夜琪琪电影网| 欧美大秀在线观看| 国产精品久久久久久久久久ktv| 亚洲欧美日韩在线播放| 久久久久久久999精品视频| 欧美日韩国产不卡| 黄网站色欧美视频| 久久亚洲视频| 午夜精品一区二区三区电影天堂| 欧美福利在线| 欧美一区日韩一区| 欧美高清视频| 久久疯狂做爰流白浆xx| 美女图片一区二区| 午夜精品免费| 美日韩精品免费| 亚洲欧美高清| 免费成人网www| 欧美一区二区三区免费观看| 美女网站久久| 欧美在线地址| 欧美日韩国产色视频| 久久精品在线播放| 欧美日韩高清在线一区| 午夜伦欧美伦电影理论片| 久久精品亚洲热| 亚洲在线视频一区| 免费欧美在线视频| 久久精品国产亚洲高清剧情介绍 | 欧美成人按摩| 亚洲国产精品久久久久| 麻豆91精品91久久久的内涵| 亚洲一区二区在线免费观看| 樱花yy私人影院亚洲| 夜夜嗨av一区二区三区| 在线观看日韩av电影| 中文精品一区二区三区 | 99re6热在线精品视频播放速度| 亚洲伦理自拍| 精品福利av| 亚洲欧美国产精品专区久久| 99视频超级精品| 久久综合色一综合色88| 欧美一区二区三区喷汁尤物| 欧美精品国产| 欧美高清视频在线| 国产日韩欧美精品一区| 亚洲视频国产视频| 亚洲一区中文| 欧美日韩亚洲三区| 亚洲激情在线| 亚洲第一二三四五区| 久久精品麻豆| 久久综合九色综合网站| 狠狠色丁香久久婷婷综合丁香| 在线观看视频亚洲| 亚洲欧洲精品一区二区三区波多野1战4 | 免费观看在线综合色| 久久综合久久综合久久| 好看的日韩av电影| 久久久蜜桃一区二区人| 免费在线观看日韩欧美| 在线精品国产欧美| 欧美成熟视频| 一区二区欧美亚洲| 欧美一区二区三区在线免费观看| 国产精品色一区二区三区| 午夜在线视频一区二区区别| 欧美在线视频一区| 在线成人av.com| 久久久噜噜噜| 91久久在线播放| 亚洲一区二区在线看| 国产日韩综合| 欧美成年人网| 亚洲免费一在线| 麻豆精品一区二区综合av| 亚洲欧洲日本一区二区三区| 久久久亚洲精品一区二区三区| 久久一区免费| 亚洲国产日韩综合一区| 正在播放欧美一区| 国产精品日韩欧美一区二区三区 | 久久漫画官网| 最新热久久免费视频| 欧美日韩在线影院| 欧美乱人伦中文字幕在线| 欧美一区二区高清| 国内精品久久久久影院优| 狂野欧美一区| 99热精品在线观看| 欧美一区国产二区| 亚洲欧洲三级电影| 国产精品v欧美精品v日韩精品| 欧美日韩中文字幕日韩欧美| 亚洲国产一区二区a毛片| 国产精品99久久久久久久久| 国产美女精品| 欧美精品久久久久久久久久| 亚洲在线播放电影| 欧美高清在线观看| 亚洲午夜精品| 在线观看日韩国产| 国产精品美女| 久久久久久久综合日本| 亚洲毛片一区| 香蕉久久夜色| 91久久精品一区二区别| 国产精品乱码一区二三区小蝌蚪| 久久香蕉国产线看观看av| 亚洲视频导航| 免费成人性网站| 久久久久九九视频| 亚洲午夜精品久久| 亚洲免费观看| 亚洲国产日日夜夜| 国产欧美在线视频|