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

隨筆 - 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>
            亚洲愉拍自拍另类高清精品| 韩国一区电影| 日韩午夜黄色| 亚洲精品国产精品国自产在线| 欧美日韩免费观看一区二区三区| 久久疯狂做爰流白浆xx| av成人黄色| 亚洲精品国产欧美| 久久免费视频网| 欧美怡红院视频| 亚洲欧美激情诱惑| 亚洲免费中文| 亚洲免费av电影| 亚洲一区在线免费观看| 亚洲香蕉成视频在线观看| 一区二区不卡在线视频 午夜欧美不卡'| 激情综合在线| 亚洲国产日韩在线| 亚洲人成网站777色婷婷| 在线国产精品播放| 亚洲国产精品日韩| 99视频国产精品免费观看| 一区二区高清视频| 新狼窝色av性久久久久久| 欧美一区二区视频免费观看| 久久国产精品一区二区三区| 久久久久国产成人精品亚洲午夜| 久久综合国产精品| 欧美77777| 日韩视频免费在线| 在线视频日韩| 新67194成人永久网站| 久久黄色小说| 欧美在线资源| 国产精品久久久久久久久免费樱桃 | 西瓜成人精品人成网站| 日韩视频在线观看国产| 一区二区三区|亚洲午夜| 亚洲自拍电影| 亚洲一区制服诱惑| 欧美精品久久一区二区| 国产精品美女久久| 一区二区三区在线观看视频| 日韩视频在线观看免费| 午夜精品区一区二区三| 免费日韩av| 亚洲欧美日本精品| 欧美成人久久| 国产日韩欧美高清免费| 99精品国产一区二区青青牛奶| 一区二区三区视频观看| 亚洲一区国产视频| 欧美国产日本韩| 亚洲精品一区中文| 久久精品国产99国产精品| 欧美激情区在线播放| 国产一区二区三区在线观看精品 | 国产精品男gay被猛男狂揉视频| 国产一区二区高清| 亚洲美女在线看| 免费在线一区二区| 亚洲免费网址| 欧美视频久久| 一区二区三区毛片| 亚洲国产精品国自产拍av秋霞| 亚洲欧美日韩系列| 欧美日韩在线一区| 国产精品少妇自拍| 欧美一区2区三区4区公司二百| 亚洲国产精品一区二区三区| 亚洲欧美精品伊人久久| 欧美日韩国产电影| 亚洲国产欧美一区二区三区久久| 久久久久成人精品| 午夜精品久久久久影视| 国产精品免费观看在线| 亚洲婷婷在线| 一本久久a久久精品亚洲| 国产亚洲人成网站在线观看| 欧美日本不卡高清| 亚洲电影视频在线| 免费成年人欧美视频| 欧美一区精品| 韩日精品视频| 久久一区二区视频| 欧美在线精品一区| 国内精品久久久久国产盗摄免费观看完整版| 中文精品一区二区三区| 99re66热这里只有精品3直播 | 亚洲愉拍自拍另类高清精品| 亚洲精品在线免费观看视频| 欧美精品一区三区在线观看| 日韩视频在线免费观看| 999在线观看精品免费不卡网站| 欧美日韩国产欧| 亚洲一区www| 亚洲一区在线视频| 国语自产精品视频在线看| 亚洲激情第一页| 欧美日韩中文在线| 性色一区二区| 欧美在线观看你懂的| 黄色亚洲大片免费在线观看| 欧美大片免费观看| 欧美日韩国产成人高清视频| 亚洲欧美bt| 久久九九精品| 日韩午夜三级在线| 欧美成人国产一区二区| 国产精品福利在线观看网址| 欧美自拍丝袜亚洲| 老司机成人网| 亚洲在线电影| 麻豆成人在线观看| 亚洲欧美视频在线观看| 久久深夜福利免费观看| 9久re热视频在线精品| 亚洲欧洲日产国产综合网| 欧美日韩一区二区三区免费看| 久久精品中文字幕一区二区三区| 免费观看一区| 亚洲人成小说网站色在线| 亚洲天堂黄色| 亚洲精品视频一区二区三区| 一区二区三区四区五区精品视频| 国产一区二区你懂的| 亚洲日韩欧美视频| 狠狠久久五月精品中文字幕| 亚洲免费观看视频| 亚洲二区三区四区| 久久麻豆一区二区| 国产伦精品一区二区三区视频孕妇 | 欧美伦理在线观看| 一区在线免费观看| 亚洲美女精品久久| 在线播放国产一区中文字幕剧情欧美| 老司机精品福利视频| 欧美日本精品在线| 麻豆91精品| 国产精品自拍视频| 亚洲精品色图| 亚洲免费av片| 欧美成人精品1314www| 欧美在线免费视屏| 欧美日韩黄色大片| 亚洲欧美福利一区二区| 久久免费视频观看| 欧美亚洲一级| 欧美午夜电影一区| 亚洲国产欧美一区二区三区丁香婷| 国产一区二区高清| 亚洲欧美日韩系列| 欧美亚洲一区三区| 欧美午夜精品伦理| 开心色5月久久精品| 国产一区91| 久久久久88色偷偷免费| 久久精品亚洲精品| 国产日韩欧美三区| 香蕉久久夜色| 久久精品视频在线免费观看| 国产视频精品va久久久久久| aa级大片欧美三级| 亚洲欧美久久久久一区二区三区| 欧美另类人妖| 亚洲婷婷综合久久一本伊一区| 一二三四社区欧美黄| 欧美啪啪成人vr| 日韩亚洲欧美精品| 亚洲亚洲精品三区日韩精品在线视频| 欧美日韩播放| 亚洲私人影院在线观看| 国产精品视频| 欧美亚洲日本国产| 久久综合久久88| 亚洲国产日韩欧美在线动漫| 麻豆国产精品一区二区三区| 亚洲国产一区二区三区a毛片| 亚洲激情在线激情| 欧美影院视频| 日韩天堂av| 久久精品国产第一区二区三区| 国产精品久久综合| 午夜在线一区二区| 欧美激情视频一区二区三区不卡| 精品成人久久| 欧美风情在线| 亚洲婷婷综合色高清在线| 欧美在线91| 亚洲国产精品黑人久久久| 欧美激情视频网站| 亚洲男女自偷自拍| 亚洲视频成人| 亚洲三级影片| 国产精品自在在线| 免费观看成人| 亚洲一区在线免费| 亚洲国产精品黑人久久久| 亚洲欧美日韩综合国产aⅴ| 欧美激情亚洲视频|