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

隨筆 - 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>
            亚洲国产成人精品久久久国产成人一区 | 亚洲美女免费精品视频在线观看| 久久久久久9| 亚洲激情第一页| 另类专区欧美制服同性| 国产精品永久免费| 在线视频欧美日韩| 亚洲激情中文1区| 免费久久99精品国产自| 伊大人香蕉综合8在线视| 久久久福利视频| 性欧美超级视频| 国产区二精品视| 午夜精品久久久久| 夜夜嗨av一区二区三区四区| 欧美国产一区二区在线观看| 亚洲精品女av网站| 亚洲欧洲日韩综合二区| 欧美高清在线视频观看不卡| 99re成人精品视频| 一区二区三区毛片| 国产精品一区二区在线观看网站 | 亚洲欧美在线视频观看| 欧美色精品天天在线观看视频| 亚洲乱码国产乱码精品精天堂| 亚洲国产专区| 欧美sm极限捆绑bd| 精品成人久久| 亚洲欧美日韩一区二区在线| 免费日韩av| 国产精品乱人伦一区二区 | 欧美伦理视频网站| 伊人精品在线| 欧美伊人久久| 久久综合九色综合欧美狠狠| 日韩视频免费在线观看| 欧美国产高潮xxxx1819| 欧美精品麻豆| 国产一区二区三区高清在线观看| 99国产精品99久久久久久| 亚洲天堂av在线免费观看| 国产欧美三级| 在线性视频日韩欧美| 在线观看日韩| 久久久夜夜夜| 欧美成人综合网站| 欧美日韩伦理在线免费| 欧美激情一区二区三区四区| 欧美国内亚洲| 香蕉久久a毛片| 久久国产精品一区二区三区四区 | 亚洲人成在线观看一区二区| 欧美电影资源| 亚洲人久久久| 麻豆av福利av久久av| 黄色成人在线免费| 久久精品日韩| 亚洲人体1000| aⅴ色国产欧美| 欧美精品日韩精品| 亚洲精品日产精品乱码不卡| 亚洲免费在线精品一区| 国产香蕉97碰碰久久人人| 欧美大色视频| 国产麻豆午夜三级精品| 亚洲日本免费| 亚洲成色www久久网站| 亚洲欧美在线磁力| 蜜桃av综合| 一区二区三区欧美| 国产亚洲精品bv在线观看| 久久久97精品| 一本久道久久综合婷婷鲸鱼| 香蕉成人久久| 日韩午夜在线播放| 在线成人激情| 精品成人国产| 国产啪精品视频| 欧美日韩亚洲免费| 久久九九精品99国产精品| 欧美高清hd18日本| 久久成人免费电影| 女人香蕉久久**毛片精品| 在线欧美不卡| 美日韩丰满少妇在线观看| 久久久久网站| 麻豆成人91精品二区三区| 99re8这里有精品热视频免费| av不卡在线| 欧美一区二区三区视频在线| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美成黄导航| 亚洲国产欧洲综合997久久| 在线免费精品视频| 久久黄色级2电影| 久久影院亚洲| 在线欧美三区| 一区二区三区久久网| 91久久在线播放| 男人的天堂成人在线| 欧美成黄导航| 久久综合伊人77777尤物| 99天天综合性| 99精品视频一区| 久久亚洲一区二区| 一本色道88久久加勒比精品| 狠狠色丁香婷综合久久| 欧美资源在线| 麻豆成人av| 日韩午夜激情av| 欧美精品激情| 一区二区免费在线观看| 欧美一区二区三区视频| 国产日韩欧美综合| 久久久久久久一区二区三区| 欧美成va人片在线观看| 一片黄亚洲嫩模| 国产精品免费视频xxxx| 久久国产主播精品| 亚洲激情在线观看视频免费| 中文久久乱码一区二区| 国产欧美va欧美va香蕉在| 久久精品亚洲精品| 亚洲精品影视| 久久久久久一区二区三区| 最新日韩在线| 国产日韩欧美在线一区| 欧美1区视频| 亚洲欧美激情视频在线观看一区二区三区| 久久国产精品99国产| 国产色视频一区| 99成人在线| 亚洲男女毛片无遮挡| 欧美精品一区二区蜜臀亚洲| 99re热精品| 久久一综合视频| 极品裸体白嫩激情啪啪国产精品| 亚洲欧洲日本专区| 麻豆精品精华液| 久久久久久亚洲综合影院红桃| 欧美日本一区二区高清播放视频| 夜夜爽www精品| 欧美一级视频精品观看| 亚洲国产精品久久久久婷婷老年| 亚洲欧洲av一区二区| 国产精品久久久亚洲一区| 亚洲欧美日韩精品久久| 亚洲国产成人精品视频 | 久久只有精品| 亚洲一区二区三区色| 亚洲国产精品成人精品| 国产精品久久久久7777婷婷| 久久这里只有| 欧美在线黄色| 亚洲午夜日本在线观看| 日韩系列在线| 亚洲韩国日本中文字幕| 美女精品在线| 欧美一区=区| 亚洲欧美网站| 亚洲一区二区黄色| 亚洲精品乱码久久久久久日本蜜臀| 国产日韩一区欧美| 国产精品美女久久久久久2018| 欧美国产精品久久| 久久亚洲春色中文字幕| 欧美一区二区三区在线播放| 亚洲新中文字幕| 一区二区三区精品在线| 99国内精品久久久久久久软件| 欧美成人激情在线| 久热成人在线视频| 久久在线免费观看| 久久婷婷人人澡人人喊人人爽| 欧美一级视频免费在线观看| 午夜久久美女| 亚洲欧美春色| 午夜精品久久久久久| 香蕉久久国产| 久久国内精品视频| 久久久久久久网| 欧美不卡在线视频| 欧美一级大片在线观看| 欧美日韩四区| 免费亚洲电影| 欧美成人69av| 最近看过的日韩成人| 蜜桃av噜噜一区| 亚洲电影毛片| 亚洲九九爱视频| 欧美激情中文不卡| 日韩午夜在线观看视频| 99热这里只有成人精品国产| 国产精品乱码妇女bbbb| 欧美日韩一级大片网址| 久久久久久亚洲精品中文字幕| 久久久激情视频| 欧美黄色免费| 国产精品亚洲综合久久| 国产精品视频一区二区三区|