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

隨筆 - 41, 文章 - 8, 評(píng)論 - 8, 引用 - 0
數(shù)據(jù)加載中……

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

在 PyQt4 中定制組件

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

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

Burning widget

這是一個(gè)組件,我們可以在 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()

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

組件放在窗口的底部。這通過(guò)一個(gè) QtGui.QHBoxLayoutQtGui.QVBoxLayout 實(shí)現(xiàn)。

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

這個(gè)組件基于 QtGui.QWidget 組件。

self.setMinimumSize(1, 30)

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

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

我們用小于默認(rèn)的字體。這適合于我們的需要。

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

我們動(dòng)態(tài)地繪制組件。窗口越大,組件會(huì)越大。反之亦然。這就是為何我們要計(jì)算組件的大小。參數(shù) till 決定了要畫多少。此值來(lái)自于滑塊組件。這是整個(gè)區(qū)域的部分值。參數(shù) full 決定了什么時(shí)候開始繪制紅色部分。注意,此處使用了浮點(diǎn)運(yùn)算,是為更高的精度。

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

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

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

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

我們移動(dòng)滑塊時(shí), changeValue() 方法就被調(diào)用了。在此方法內(nèi)部,我們發(fā)送了自定義的 updateBW 信號(hào),并且?guī)Я艘粋€(gè)參數(shù)。這個(gè)參數(shù)是當(dāng)前滑塊的值。這個(gè)值用于計(jì)算在 Burning 這個(gè)組件中要繪制多少。自定義的組件然后被重繪。


本部分,我們創(chuàng)建了自己的組件。

posted on 2012-02-12 10:17 mirguest 閱讀(1233) 評(píng)論(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>
            狠狠入ady亚洲精品| 在线视频免费在线观看一区二区| 亚洲欧洲日本在线| 亚洲性视频h| 亚洲欧洲日产国产网站| 欧美日产一区二区三区在线观看| 亚洲淫性视频| 亚洲欧美日韩视频一区| 午夜日韩激情| 亚洲直播在线一区| 99热免费精品在线观看| 亚洲国产精品视频一区| 亚洲承认在线| 亚洲欧洲视频| 一区二区高清视频在线观看| 亚洲国产成人在线| 国产精品日韩久久久久| 国产喷白浆一区二区三区| 国产精品尤物| 国产一区二区三区久久久久久久久| 国产精品女人久久久久久| 国产精品免费区二区三区观看| 国产婷婷97碰碰久久人人蜜臀| 免费在线欧美视频| 欧美韩国在线| 欧美香蕉大胸在线视频观看| 国产精品久久网| 国产一区二区三区奇米久涩| 国产自产在线视频一区| 国产专区一区| 久久精品亚洲一区二区| 女同一区二区| 国产精品超碰97尤物18| 国产日韩精品一区二区| 伊人春色精品| 99精品热6080yy久久 | 久久婷婷久久| 欧美成人午夜影院| 亚洲精品视频免费| 激情久久久久久| 在线视频日韩| 久久久欧美一区二区| 欧美成人精品三级在线观看| 亚洲免费观看高清完整版在线观看| 亚洲亚洲精品三区日韩精品在线视频| 这里只有精品视频| 免费成人高清视频| 国产精品乱子久久久久| 在线精品高清中文字幕| 亚洲午夜影视影院在线观看| 久久久噜噜噜久噜久久 | 日韩视频在线你懂得| 狠狠色丁香久久综合频道| 一本色道久久综合亚洲精品婷婷| 亚洲全黄一级网站| 久久国产毛片| 欧美国产一区二区| 久久激情视频| 亚洲一区二区三区乱码aⅴ| 久久久久国产一区二区| 国产中文一区| 久久综合伊人| 久久午夜国产精品| 亚洲精品久久| 亚洲激情一区| 欧美日韩人人澡狠狠躁视频| 一区二区三区视频免费在线观看 | 亚洲大胆人体视频| 久久躁狠狠躁夜夜爽| 久久免费视频观看| 性xx色xx综合久久久xx| 男人的天堂亚洲| 亚洲高清不卡在线| 模特精品在线| 欧美成人午夜免费视在线看片| 亚洲黄色av| 99精品黄色片免费大全| 国产精品国产三级国产aⅴ9色| 亚洲欧美国产日韩天堂区| 欧美亚洲网站| 亚洲国产精品日韩| 一区二区高清| 韩国精品在线观看| 亚洲高清二区| 国产精品第一区| 久久精品夜色噜噜亚洲aⅴ| 久久久免费观看视频| 99视频在线精品国自产拍免费观看 | 久久久久久综合网天天| 久久麻豆一区二区| 日韩午夜电影av| 亚洲视频在线播放| 国产美女精品人人做人人爽| 蜜臀av在线播放一区二区三区| 欧美成人午夜影院| 午夜日韩在线| 欧美成人一区二免费视频软件| 午夜精品一区二区三区在线播放| 久久精彩视频| 亚洲无线视频| 久久全国免费视频| 亚洲午夜久久久久久久久电影网| 欧美在线播放一区| 一本久久a久久精品亚洲| 欧美一级在线播放| 一本久久综合亚洲鲁鲁五月天| 欧美一级播放| 亚洲一区视频| 免费毛片一区二区三区久久久| 西瓜成人精品人成网站| 亚洲综合色网站| 欧美成人精品1314www| 亚欧美中日韩视频| 国产亚洲日本欧美韩国| 狠狠入ady亚洲精品| 99国产精品| 亚洲欧洲中文日韩久久av乱码| 亚洲网站在线看| 日韩亚洲视频在线| 毛片基地黄久久久久久天堂| 欧美一区二区私人影院日本| 欧美精品播放| 亚洲高清网站| 好吊妞**欧美| 亚洲欧美在线一区| 亚洲男人的天堂在线| 欧美国产一区二区三区激情无套| 老妇喷水一区二区三区| 国产亚洲成av人片在线观看桃| 一区二区三区四区五区在线 | 在线亚洲高清视频| 亚洲视频在线观看网站| 亚洲手机在线| 香港久久久电影| 欧美精品一区二区三区视频| 一本大道久久a久久精品综合| 毛片av中文字幕一区二区| 久色婷婷小香蕉久久| 国内成人精品一区| 久久成人国产精品| 久热国产精品| 136国产福利精品导航网址应用| 欧美一区二区三区视频免费| 欧美一区亚洲一区| 国产一区二区三区四区五区美女 | 另类天堂视频在线观看| 欧美福利电影网| 亚洲大片在线| 欧美精品在线一区| 一本久道久久久| 国产精品第十页| 国内成人精品视频| 亚洲国产欧美不卡在线观看| 一本色道久久| 久久精品三级| 欧美午夜大胆人体| 亚洲一区二区三区四区在线观看| 亚洲专区免费| 国产亚洲欧美日韩日本| 久久午夜精品一区二区| 91久久久在线| 亚洲免费在线视频一区 二区| 国产日韩欧美在线| 免费在线看一区| 亚洲一区二区三区精品在线观看| 久久人体大胆视频| 一区二区免费在线观看| 日韩午夜av在线| 国产日产欧产精品推荐色| 久久久久综合| 亚洲九九爱视频| 日韩视频中午一区| 欧美裸体一区二区三区| 久久精品国产清自在天天线| 国产自产在线视频一区 | 国产精品久久久久久久app| 午夜精品免费在线| 欧美激情一区二区三区| 亚洲综合日韩在线| 亚洲激情社区| 国产精品中文字幕欧美| 欧美成人有码| 欧美伊人精品成人久久综合97| 亚洲大片在线| 久久久国际精品| 在线视频一区二区| 亚洲大片在线| 国产亚洲永久域名| 欧美日韩在线影院| 牛牛影视久久网| 久久精品二区亚洲w码| 一区二区激情视频| 亚洲高清久久网| 老色批av在线精品| 亚洲男人av电影| 在线亚洲高清视频| 夜夜嗨一区二区三区| 亚洲精品黄色| 亚洲国产三级| 亚洲欧洲另类国产综合|