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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【概览】 1、显示原生Qwidget       1)不使用布局(绝对定位)       2)使用布局 2、显示Qwidget的自定义类       1)不使用布局(绝对定位)       2)使用布局   【知识点】 1、显示原生Qwidget 1)不使用布局(绝对定位) 这...

【概览】

1、显示原生Qwidget

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

      2)使用布局

2、显示Qwidget的自定义类

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

      2)使用布

 

【知识点】

1、显示原生Qwidget

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

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

 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)

【效果图】

2)使用布局

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

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)

【效果图】

2、显示Qwidget的自定义类

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

这种情况下,原生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         

 

 

【效果图】

 

2)使用布局

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

 

 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的自定义类")

 

 

【效果图】

 

 

【源代码】(依次)

 

 1 from PyQt5.QtCore import *
 2 from PyQt5.QtGui import *
 3 from PyQt5.QtWidgets import *
 4 
 5 
 6 
 7 class MyWindow(QWidget):
 8     def __init__(self):
 9         super(MyWindow,self).__init__()
10         self.resize(400, 300)
11         
12         # 添加原生QWidget
13         self.widget = QWidget(self) # 注意QWidget(self) 内的self!!
14         self.widget.setGeometry(10,10,380,250)
15         self.widget.setStyleSheet("background-color:grey;")
16         
17         # 添加编辑框(QLineEdit)
18         self.lineEdit = QLineEdit("0",self) # 注意QLineEdit("0",self) 内的self!!
19         self.lineEdit.setGeometry(10,270,380,20)
20 
21         self.setWindowTitle("1、原生QWidget")
22         
23         
24 if __name__ == '__main__':
25     import sys
26     app = QApplication(sys.argv)
27     dialog = MyWindow()
28     dialog.show();
29     sys.exit(app.exec_())   
View Code

 

 1 from PyQt5.QtCore import *
 2 from PyQt5.QtGui import *
 3 from PyQt5.QtWidgets import *
 4 
 5 
 6 
 7 class MyWindow(QWidget):
 8     def __init__(self):
 9         super(MyWindow,self).__init__()
10         self.resize(400, 300)
11         layout = QGridLayout()
12 
13         # 添加原生QWidget
14         self.widget = QWidget()
15         self.widget.setStyleSheet("background-color:grey;")
16         
17         # 添加编辑框(QLineEdit)
18         self.lineEdit = QLineEdit("0")
19 
20         # 放入布局内
21         layout.addWidget(self.widget,0,0)
22         layout.addWidget(self.lineEdit,1,0)
23         self.setLayout(layout)
24 
25         self.setWindowTitle("2、原生QWidget")
26         
27 if __name__ == '__main__':
28     import sys
29     app = QApplication(sys.argv)
30     dialog = MyWindow()
31     dialog.show();
32     sys.exit(app.exec_())   
View Code

 

 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         #QWidget派生类里面要放个东西!!(不放东西的话,我也不会)
11         self.gb = QGroupBox(self)
12         self.gb.setGeometry(0,0,200,200) #一定要有个东西把它撑起来!!不然看不到
13         self.setStyleSheet("background-color:grey;")
14 
15         self.do_something()
16         
17     def do_something(self):
18         pass
19 
20 
21 class MyWindow(QWidget):
22     def __init__(self, parent=None):
23         super(MyWindow,self).__init__(parent)
24         self.resize(400,300)
25 
26         # 添加自定义部件(MyWidget)
27         self.widget = MyWidget(self)
28         self.widget.setGeometry(10,10,380,240)
29 
30         
31         # 添加编辑框(QLineEdit)
32         self.lineEdit = QLineEdit("0",self)
33         self.lineEdit.setGeometry(10,260,380,20)
34 
35         self.setWindowTitle("3、QWidget的派生类")
36         
37 if __name__ == '__main__':
38     import sys
39     app = QApplication(sys.argv)
40     window = MyWindow()
41     window.show();
42     sys.exit(app.exec_())   
View Code

 

 1 from PyQt5.QtCore import *
 2 from PyQt5.QtGui import *
 3 from PyQt5.QtWidgets import *
 4 
 5 class MyWidget(QWidget):
 6     def __init__(self, parent=None):
 7         super(MyWidget,self).__init__(parent)
 8         
 9         #QWidget派生类里面要放个东西!!(不放东西的话,我也不会)
10         self.gb = QGroupBox(self)
11         self.gb.setGeometry(0,0,200,200) #一定要有个东西把它撑起来!!不然看不到
12         self.setStyleSheet("background-color:red;")
13         self.do_something()
14         
15     def do_something(self):
16         pass
17 
18 
19 
20 class MyWindow(QWidget):
21     def __init__(self):
22         super(MyWindow,self).__init__()
23         self.resize(400,300)
24         layout = QGridLayout()
25         
26         # 添加自定义部件(MyWidget)
27         self.widget = MyWidget(self) # sizeHint() = QSize(-1, -1)
28         self.widget.setStyleSheet("background-color:red;")
29         
30         # 添加编辑框(QLineEdit)
31         self.lineEdit = QLineEdit("0",self) # sizeHint() = QSize(75, 20)
32 
33         # 放入布局内
34         layout.addWidget(self.widget,0,0)
35         layout.addWidget(self.lineEdit,1,0)
36         self.setLayout(layout)
37 
38 
39         
40 if __name__ == '__main__':
41     import sys
42     app = QApplication(sys.argv)
43     window = MyWindow()
44     window.show();
45     sys.exit(app.exec_())   
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类:

 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)

 

【效果图】

 

【完整代码】

 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应用实例: 飘动的文字

 

【效果图】

 

【源代码】

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

 

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7月前
|
算法 API C++
【Qt UI】QT 窗口/控件置顶方法详解
【Qt UI】QT 窗口/控件置顶方法详解
547 0
|
4月前
|
编解码 开发框架
【Qt 学习笔记】Qt窗口 | Qt窗口介绍 | QMainwindow类及各组件介绍
【Qt 学习笔记】Qt窗口 | Qt窗口介绍 | QMainwindow类及各组件介绍
321 3
|
4月前
|
容器
【Qt 学习笔记】Qt常用控件 | 容器类控件 | Tab Widget的使用及说明
【Qt 学习笔记】Qt常用控件 | 容器类控件 | Tab Widget的使用及说明
204 2
|
4月前
|
存储
【Qt 学习笔记】Qt常用控件 | 多元素控件 | Table Widget的说明及介绍
【Qt 学习笔记】Qt常用控件 | 多元素控件 | Table Widget的说明及介绍
281 3
|
4月前
【qt】自定义对话框(1)
【qt】自定义对话框(1)
36 0
|
4月前
【qt】自定义对话框(2)
【qt】自定义对话框(2)
32 0
|
4月前
【Qt 学习笔记】Qt常用控件 | 显示类控件 | Calendar Widget的使用及说明
【Qt 学习笔记】Qt常用控件 | 显示类控件 | Calendar Widget的使用及说明
224 0
|
7月前
|
XML 设计模式 JSON
QT 项目视图(QListView&QTreeView&QTableView)和项目部件(QListWidget&QTreeWidget&QTableWidget)详解-1
QT 项目视图(QListView&QTreeView&QTableView)和项目部件(QListWidget&QTreeWidget&QTableWidget)详解
|
7月前
|
数据库 开发者 Windows
QT 项目视图(QListView&QTreeView&QTableView)和项目部件(QListWidget&QTreeWidget&QTableWidget)详解-2
QT 项目视图(QListView&QTreeView&QTableView)和项目部件(QListWidget&QTreeWidget&QTableWidget)详解
PyQt5-QLabel控件是什么?方法有哪些?具体如何使用?
PyQt5-QLabel控件是什么?方法有哪些?具体如何使用?
75 0