且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)

更新时间:2022-09-22 12:03:52

【概览】

1、显示原生Qwidget

      1)不使用布局(绝对定位)

      2)使用布局

2、显示Qwidget的自定义类

      1)不使用布局(绝对定位)

      2)使用布

 

【知识点】

1、显示原生Qwidget

1)不使用布局(绝对定位)

这种情况下,原生QWidget部件在实例化时必须带parent参数,当然parent = self,即:  self.widget = QWidget(self)

PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)
 1 class MyWindow(QWidget):
 2     def __init__(self, parent=None):
 3         super(MyWindow,self).__init__(parent)
 4         self.resize(400, 300)
 5         
 6         # 添加原生QWidget
 7         self.widget = QWidget(self) # 注意QWidget(self) 内的self!!
 8         self.widget.setGeometry(10,10,380,250)
 9         self.widget.setStyleSheet("background-color:grey;")
10         
11         # 添加编辑框(QLineEdit)
12         self.lineEdit = QLineEdit("0",self) # 注意QLineEdit("0",self) 内的self!!
13         self.lineEdit.setGeometry(10,270,380,20)
PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)

【效果图】

PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)

2)使用布局

这种情况下,原生QWidget部件在实例化时可以不带parent参数,parent =None / self都行,即: self.widget = QWidget()self.widget = QWidget(self)

PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)
class MyWindow(QWidget):
    def __init__(self, parent=None):
        super(MyWindow,self).__init__(parent)
        self.resize(400, 300)
        layout = QGridLayout()

        # 添加原生QWidget
        self.widget = QWidget()  # 注意QWidget() 内可以没有self!!
        self.widget.setStyleSheet("background-color:grey;")
        
        # 添加编辑框(QLineEdit)
        self.lineEdit = QLineEdit("0") # 注意QLineEdit("0") 内可以没self!!

        # 放入布局内
        layout.addWidget(self.widget,0,0)
        layout.addWidget(self.lineEdit,1,0)
        self.setLayout(layout)
PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)

【效果图】

PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)

2、显示Qwidget的自定义类

1)不使用布局(绝对定位)

这种情况下,原生QWidget自定义类里面要放个东西!!不放东西的话,我也不会:(

 

PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)
 1 class MyWidget(QWidget):
 2     def __init__(self, parent=None):
 3         super(MyWidget,self).__init__(parent)
 4 
 5         #QWidget自定义类里面要放个东西!!(不放东西的话,我也不会)
 6         self.gb = QGroupBox(self)
 7         self.gb.setGeometry(0,0,200,200) #一定要有个东西把它撑起来!!不然看不到
 8         self.setStyleSheet("background-color:grey;")
 9 
10         self.do_something()
11         
12     def do_something(self):
13         pass
14 
15 
16 class MyWindow(QWidget):
17     def __init__(self, parent=None):
18         super(MyWindow,self).__init__(parent)
19         self.resize(400,300)
20 
21         # 添加自定义部件(MyWidget)
22         self.widget = MyWidget(self)
23         self.widget.setGeometry(10,10,380,240)
24 
25         
26         # 添加编辑框(QLineEdit)
27         self.lineEdit = QLineEdit("0",self)
28         self.lineEdit.setGeometry(10,260,380,20)
29 
30         
PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)

 

 

【效果图】

 PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)

2)使用布局

这种情况下,原生QWidget部件在实例化时可以不带parent参数,parent =None / self都行,即: self.widget = QWidget()或self.widget = QWidget(self)

 

PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)
 1 class MyWindow(QWidget):
 2     def __init__(self, parent=None):
 3         super(MyWindow,self).__init__(parent)
 4         self.resize(400,300)
 5         layout = QGridLayout()
 6         
 7         # 添加自定义部件(MyWidget)
 8         self.widget = MyWidget()
 9         
10         # 添加编辑框(QLineEdit)
11         self.lineEdit = QLineEdit("0")
12 
13         # 放入布局内
14         layout.addWidget(self.widget,0,0)
15         layout.addWidget(self.lineEdit,1,0)
16         self.setLayout(layout)
17 
18         self.setWindowTitle("4、QWidget的自定义类")
PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)

 

 

【效果图】

 PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)

 

【源代码】(依次)

 

PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决) View Code

 

PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决) View Code

 

PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决) View Code

 

PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决) View Code

 

 

 

【增补】

皇天不负苦心人,终于完美解决了。

问题出在自定义的QWidget类里面,加上下面三句即可:

 

1         self.setPalette(QPalette(Qt.red)) # 这一句是辅助!着色,区分背景。这一句与self.setStyleSheet("background-color:red;")咋看一样,影响不一样
2         self.setAutoFillBackground(True) # 这一句是关键!!!自动填充背景
3         self.setMinimumSize(100,100) # 这一句是辅助!!因为这个自定义的QWidget默认大小(sizeHint())是0,看不到!

其中,第一句与 self.setBackgroundRole(QPalette.Midlight) 及 self.setStyleSheet("background-color:red;") 的第一感觉是等效的 ??? 各位自己体会吧:(

1         self.setPalette(QPalette(Qt.red))
2 
3         self.setBackgroundRole(QPalette.Midlight)
4 
5         self.setStyleSheet("background-color:red;")

 

 

完整自定义的QWidget类:

PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)
 1 class MyWidget(QWidget):
 2     def __init__(self, parent=None):
 3         super(MyWidget,self).__init__(parent)
 4 
 5         self.setPalette(QPalette(Qt.red)) # 这一句是辅助!着色,区分背景。这一句与self.setStyleSheet("background-color:red;")咋看一样,影响不一样
 6         self.setAutoFillBackground(True) #这一句是关键!!!自动填充背景
 7         self.setMinimumSize(100,100) # 这一句是辅助!!因为这个自定义的QWidget默认大小(sizeHint())是0,看不到!
 8         #self.setMaximumSize(500, 500)
 9         #self.setFixesSize(400,200)
10 
11         # 做一些别的事情......
12         self.do_something()
13         
14     def do_something(self):
15         pass
16         
17 
18     # 如果需要的话,就覆写属性函数:sizeHint(默认尺寸)
19     #def sizeHint(self):
20     #    return QSize(400, 200)
21     # 如果需要的话,就覆写属性函数:minimumSizeHint(最小尺寸)
22     #def minimumSizeHint(self):
23     #    return QSize(100, 100)
PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)

 

【效果图】

PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)

 

【完整代码】

PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)
 1 from PyQt5.QtCore import *
 2 from PyQt5.QtGui import *
 3 from PyQt5.QtWidgets import *
 4 
 5 
 6 class MyWidget(QWidget):
 7     def __init__(self, parent=None):
 8         super(MyWidget,self).__init__(parent)
 9 
10         self.setPalette(QPalette(Qt.red)) # 这一句是辅助!着色,区分背景。这一句与self.setStyleSheet("background-color:red;")咋看一样,影响不一样
11         self.setAutoFillBackground(True) #这一句是关键!!!自动填充背景
12         self.setMinimumSize(100,100) # 这一句是辅助!!因为这个自定义的QWidget默认大小(sizeHint())是0,看不到! 不过主窗体使用了布局的话,此句可省略
13         #self.setMaximumSize(500, 500)
14         #self.setFixesSize(400,200)
15 
16         # 做一些别的事情......
17         self.do_something()
18         
19     def do_something(self):
20         pass
21         
22 
23     # 如果需要的话,就覆写属性函数:sizeHint(默认尺寸)
24     #def sizeHint(self):
25     #    return QSize(400, 200)
26     # 如果需要的话,就覆写属性函数:minimumSizeHint(最小尺寸)
27     #def minimumSizeHint(self):
28     #    return QSize(100, 100)
29 
30         
31         
32         
33 class MyWindow(QWidget):
34     def __init__(self, parent=None):
35         super(MyWindow,self).__init__(parent)
36         self.resize(400,300)
37         layout = QGridLayout()
38         
39         # 添加自定义部件(MyWidget)
40         self.widget = MyWidget() # 这里可以不要self
41         
42         # 添加编辑框(QLineEdit)
43         self.lineEdit = QLineEdit("0") # 这里可以不要self
44 
45         # 放入布局内
46         layout.addWidget(self.widget,0,0)
47         layout.addWidget(self.lineEdit,1,0)
48         self.setLayout(layout)
49 
50         self.setWindowTitle("5、完美显示QWidget的派生类")
51         
52 if __name__ == '__main__':
53     import sys
54     app = QApplication(sys.argv)
55     window = MyWindow()
56     window.show();
57     sys.exit(app.exec_())   
PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)

 

再另外补充一个PyQt5应用实例: 飘动的文字

 

【效果图】

PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)

 

【源代码】

PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)
  1 #!/usr/bin/env python
  2 
  3 
  4 #############################################################################
  5 ##
  6 ## Copyright (C) 2013 Riverbank Computing Limited.
  7 ## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
  8 ## All rights reserved.
  9 ##
 10 ## This file is part of the examples of PyQt.
 11 ##
 12 ## $QT_BEGIN_LICENSE:BSD$
 13 ## You may use this file under the terms of the BSD license as follows:
 14 ##
 15 ## "Redistribution and use in source and binary forms, with or without
 16 ## modification, are permitted provided that the following conditions are
 17 ## met:
 18 ##   * Redistributions of source code must retain the above copyright
 19 ##     notice, this list of conditions and the following disclaimer.
 20 ##   * Redistributions in binary form must reproduce the above copyright
 21 ##     notice, this list of conditions and the following disclaimer in
 22 ##     the documentation and/or other materials provided with the
 23 ##     distribution.
 24 ##   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
 25 ##     the names of its contributors may be used to endorse or promote
 26 ##     products derived from this software without specific prior written
 27 ##     permission.
 28 ##
 29 ## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 30 ## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 31 ## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 32 ## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 33 ## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 34 ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 35 ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 36 ## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 37 ## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 38 ## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 39 ## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
 40 ## $QT_END_LICENSE$
 41 ##
 42 #############################################################################
 43 
 44 
 45 from PyQt5.QtCore import QBasicTimer
 46 from PyQt5.QtGui import QColor, QFontMetrics, QPainter, QPalette
 47 from PyQt5.QtWidgets import (QApplication, QDialog, QLineEdit, QVBoxLayout,
 48         QWidget)
 49 
 50 
 51 class WigglyWidget(QWidget):
 52     def __init__(self, parent=None):
 53         super(WigglyWidget, self).__init__(parent)
 54 
 55         self.setBackgroundRole(QPalette.Midlight)
 56         self.setAutoFillBackground(True)
 57 
 58         newFont = self.font()
 59         newFont.setPointSize(newFont.pointSize() + 20)
 60         self.setFont(newFont)
 61 
 62         self.timer = QBasicTimer()
 63         self.text = ''
 64 
 65         self.step = 0;
 66         self.timer.start(60, self)   
 67 
 68     def paintEvent(self, event):
 69         sineTable = (0, 38, 71, 92, 100, 92, 71, 38, 0, -38, -71, -92, -100, -92, -71, -38)
 70 
 71         metrics = QFontMetrics(self.font())
 72         x = (self.width() - metrics.width(self.text)) / 2
 73         y = (self.height() + metrics.ascent() - metrics.descent()) / 2
 74         color = QColor()
 75 
 76         painter = QPainter(self)
 77 
 78         for i, ch in enumerate(self.text):
 79             index = (self.step + i) % 16
 80             color.setHsv((15 - index) * 16, 255, 191)
 81             painter.setPen(color)
 82             painter.drawText(x, y - ((sineTable[index] * metrics.height()) / 400), ch)
 83             x += metrics.width(ch)
 84 
 85     def setText(self, newText):
 86         self.text = newText
 87 
 88     def timerEvent(self, event):
 89         if event.timerId() == self.timer.timerId():
 90             self.step += 1
 91             self.update()
 92         else:
 93             super(WigglyWidget, self).timerEvent(event)
 94 
 95 
 96 class Dialog(QDialog):
 97     def __init__(self, parent=None):
 98         super(Dialog, self).__init__(parent)
 99 
100         wigglyWidget = WigglyWidget()
101         lineEdit = QLineEdit()
102 
103         layout = QVBoxLayout()
104         layout.addWidget(wigglyWidget)
105         layout.addWidget(lineEdit)
106         self.setLayout(layout)
107 
108         lineEdit.textChanged.connect(wigglyWidget.setText)
109 
110         lineEdit.setText("Hello world!")
111 
112         self.setWindowTitle("Wiggly")
113         self.resize(360, 145)
114 
115 
116 if __name__ == '__main__':
117 
118     import sys
119 
120     app = QApplication(sys.argv)
121     dialog = Dialog()
122     dialog.show();
123     sys.exit(app.exec_())    
PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)

 

本文转自罗兵博客园博客,原文链接:http://www.cnblogs.com/hhh5460/p/4277950.html,如需转载请自行联系原作者