【概览】

1、显示原生Qwidget

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

2)使用布局

2、显示Qwidget的自定义类

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

      2)使用布局

【知识点】

1、显示原生Qwidget

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

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

 class MyWindow(QWidget):
def __init__(self, parent=None):
super(MyWindow,self).__init__(parent)
self.resize(400, 300) # 添加原生QWidget
self.widget = QWidget(self) # 注意QWidget(self) 内的self!!
self.widget.setGeometry(10,10,380,250)
self.widget.setStyleSheet("background-color:grey;") # 添加编辑框(QLineEdit)
self.lineEdit = QLineEdit("",self) # 注意QLineEdit("0",self) 内的self!!
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("") # 注意QLineEdit("0") 内可以没self!! # 放入布局内
layout.addWidget(self.widget,0,0)
layout.addWidget(self.lineEdit,1,0)
self.setLayout(layout)

【效果图】

2、显示Qwidget的自定义类

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

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

 class MyWidget(QWidget):
def __init__(self, parent=None):
super(MyWidget,self).__init__(parent) #QWidget自定义类里面要放个东西!!(不放东西的话,我也不会)
self.gb = QGroupBox(self)
self.gb.setGeometry(0,0,200,200) #一定要有个东西把它撑起来!!不然看不到
self.setStyleSheet("background-color:grey;") self.do_something() def do_something(self):
pass class MyWindow(QWidget):
def __init__(self, parent=None):
super(MyWindow,self).__init__(parent)
self.resize(400,300) # 添加自定义部件(MyWidget)
self.widget = MyWidget(self)
self.widget.setGeometry(10,10,380,240) # 添加编辑框(QLineEdit)
self.lineEdit = QLineEdit("",self)
self.lineEdit.setGeometry(10,260,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() # 添加自定义部件(MyWidget)
self.widget = MyWidget() # 添加编辑框(QLineEdit)
self.lineEdit = QLineEdit("") # 放入布局内
layout.addWidget(self.widget,0,0)
layout.addWidget(self.lineEdit,1,0)
self.setLayout(layout) self.setWindowTitle("4、QWidget的自定义类")

【效果图】

【源代码】(依次)

 from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import * class MyWindow(QWidget):
def __init__(self):
super(MyWindow,self).__init__()
self.resize(400, 300) # 添加原生QWidget
self.widget = QWidget(self) # 注意QWidget(self) 内的self!!
self.widget.setGeometry(10,10,380,250)
self.widget.setStyleSheet("background-color:grey;") # 添加编辑框(QLineEdit)
self.lineEdit = QLineEdit("",self) # 注意QLineEdit("0",self) 内的self!!
self.lineEdit.setGeometry(10,270,380,20) self.setWindowTitle("1、原生QWidget") if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
dialog = MyWindow()
dialog.show();
sys.exit(app.exec_())
 from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import * class MyWindow(QWidget):
def __init__(self):
super(MyWindow,self).__init__()
self.resize(400, 300)
layout = QGridLayout() # 添加原生QWidget
self.widget = QWidget()
self.widget.setStyleSheet("background-color:grey;") # 添加编辑框(QLineEdit)
self.lineEdit = QLineEdit("") # 放入布局内
layout.addWidget(self.widget,0,0)
layout.addWidget(self.lineEdit,1,0)
self.setLayout(layout) self.setWindowTitle("2、原生QWidget") if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
dialog = MyWindow()
dialog.show();
sys.exit(app.exec_())
 from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import * class MyWidget(QWidget):
def __init__(self, parent=None):
super(MyWidget,self).__init__(parent) #QWidget派生类里面要放个东西!!(不放东西的话,我也不会)
self.gb = QGroupBox(self)
self.gb.setGeometry(0,0,200,200) #一定要有个东西把它撑起来!!不然看不到
self.setStyleSheet("background-color:grey;") self.do_something() def do_something(self):
pass class MyWindow(QWidget):
def __init__(self, parent=None):
super(MyWindow,self).__init__(parent)
self.resize(400,300) # 添加自定义部件(MyWidget)
self.widget = MyWidget(self)
self.widget.setGeometry(10,10,380,240) # 添加编辑框(QLineEdit)
self.lineEdit = QLineEdit("",self)
self.lineEdit.setGeometry(10,260,380,20) self.setWindowTitle("3、QWidget的派生类") if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = MyWindow()
window.show();
sys.exit(app.exec_())
 from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import * class MyWidget(QWidget):
def __init__(self, parent=None):
super(MyWidget,self).__init__(parent) #QWidget派生类里面要放个东西!!(不放东西的话,我也不会)
self.gb = QGroupBox(self)
self.gb.setGeometry(0,0,200,200) #一定要有个东西把它撑起来!!不然看不到
self.setStyleSheet("background-color:red;")
self.do_something() def do_something(self):
pass class MyWindow(QWidget):
def __init__(self):
super(MyWindow,self).__init__()
self.resize(400,300)
layout = QGridLayout() # 添加自定义部件(MyWidget)
self.widget = MyWidget(self) # sizeHint() = QSize(-1, -1)
self.widget.setStyleSheet("background-color:red;") # 添加编辑框(QLineEdit)
self.lineEdit = QLineEdit("",self) # sizeHint() = QSize(75, 20) # 放入布局内
layout.addWidget(self.widget,0,0)
layout.addWidget(self.lineEdit,1,0)
self.setLayout(layout) if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = MyWindow()
window.show();
sys.exit(app.exec_())

【增补】

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

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

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

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

         self.setPalette(QPalette(Qt.red))

         self.setBackgroundRole(QPalette.Midlight)

         self.setStyleSheet("background-color:red;")

完整自定义的QWidget类:

 class MyWidget(QWidget):
def __init__(self, parent=None):
super(MyWidget,self).__init__(parent) self.setPalette(QPalette(Qt.red)) # 这一句是辅助!着色,区分背景。这一句与self.setStyleSheet("background-color:red;")咋看一样,影响不一样
self.setAutoFillBackground(True) #这一句是关键!!!自动填充背景
self.setMinimumSize(100,100) # 这一句是辅助!!因为这个自定义的QWidget默认大小(sizeHint())是0,看不到!
#self.setMaximumSize(500, 500)
#self.setFixesSize(400,200) # 做一些别的事情......
self.do_something() def do_something(self):
pass # 如果需要的话,就覆写属性函数:sizeHint(默认尺寸)
#def sizeHint(self):
# return QSize(400, 200)
# 如果需要的话,就覆写属性函数:minimumSizeHint(最小尺寸)
#def minimumSizeHint(self):
# return QSize(100, 100)

【效果图】

【完整代码】

 from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import * class MyWidget(QWidget):
def __init__(self, parent=None):
super(MyWidget,self).__init__(parent) self.setPalette(QPalette(Qt.red)) # 这一句是辅助!着色,区分背景。这一句与self.setStyleSheet("background-color:red;")咋看一样,影响不一样
self.setAutoFillBackground(True) #这一句是关键!!!自动填充背景
self.setMinimumSize(100,100) # 这一句是辅助!!因为这个自定义的QWidget默认大小(sizeHint())是0,看不到! 不过主窗体使用了布局的话,此句可省略
#self.setMaximumSize(500, 500)
#self.setFixesSize(400,200) # 做一些别的事情......
self.do_something() def do_something(self):
pass # 如果需要的话,就覆写属性函数:sizeHint(默认尺寸)
#def sizeHint(self):
# return QSize(400, 200)
# 如果需要的话,就覆写属性函数:minimumSizeHint(最小尺寸)
#def minimumSizeHint(self):
# return QSize(100, 100) class MyWindow(QWidget):
def __init__(self, parent=None):
super(MyWindow,self).__init__(parent)
self.resize(400,300)
layout = QGridLayout() # 添加自定义部件(MyWidget)
self.widget = MyWidget() # 这里可以不要self # 添加编辑框(QLineEdit)
self.lineEdit = QLineEdit("") # 这里可以不要self # 放入布局内
layout.addWidget(self.widget,0,0)
layout.addWidget(self.lineEdit,1,0)
self.setLayout(layout) self.setWindowTitle("5、完美显示QWidget的派生类") if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = MyWindow()
window.show();
sys.exit(app.exec_())

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

【效果图】

【源代码】

 #!/usr/bin/env python

 #############################################################################
##
## Copyright (C) 2013 Riverbank Computing Limited.
## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
## All rights reserved.
##
## This file is part of the examples of PyQt.
##
## $QT_BEGIN_LICENSE:BSD$
## You may use this file under the terms of the BSD license as follows:
##
## "Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that the following conditions are
## met:
## * Redistributions of source code must retain the above copyright
## notice, this list of conditions and the following disclaimer.
## * Redistributions in binary form must reproduce the above copyright
## notice, this list of conditions and the following disclaimer in
## the documentation and/or other materials provided with the
## distribution.
## * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
## the names of its contributors may be used to endorse or promote
## products derived from this software without specific prior written
## permission.
##
## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
## $QT_END_LICENSE$
##
############################################################################# from PyQt5.QtCore import QBasicTimer
from PyQt5.QtGui import QColor, QFontMetrics, QPainter, QPalette
from PyQt5.QtWidgets import (QApplication, QDialog, QLineEdit, QVBoxLayout,
QWidget) class WigglyWidget(QWidget):
def __init__(self, parent=None):
super(WigglyWidget, self).__init__(parent) self.setBackgroundRole(QPalette.Midlight)
self.setAutoFillBackground(True) newFont = self.font()
newFont.setPointSize(newFont.pointSize() + 20)
self.setFont(newFont) self.timer = QBasicTimer()
self.text = '' self.step = 0;
self.timer.start(60, self) def paintEvent(self, event):
sineTable = (0, 38, 71, 92, 100, 92, 71, 38, 0, -38, -71, -92, -100, -92, -71, -38) metrics = QFontMetrics(self.font())
x = (self.width() - metrics.width(self.text)) / 2
y = (self.height() + metrics.ascent() - metrics.descent()) / 2
color = QColor() painter = QPainter(self) for i, ch in enumerate(self.text):
index = (self.step + i) % 16
color.setHsv((15 - index) * 16, 255, 191)
painter.setPen(color)
painter.drawText(x, y - ((sineTable[index] * metrics.height()) / 400), ch)
x += metrics.width(ch) def setText(self, newText):
self.text = newText def timerEvent(self, event):
if event.timerId() == self.timer.timerId():
self.step += 1
self.update()
else:
super(WigglyWidget, self).timerEvent(event) class Dialog(QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent) wigglyWidget = WigglyWidget()
lineEdit = QLineEdit() layout = QVBoxLayout()
layout.addWidget(wigglyWidget)
layout.addWidget(lineEdit)
self.setLayout(layout) lineEdit.textChanged.connect(wigglyWidget.setText) lineEdit.setText("Hello world!") self.setWindowTitle("Wiggly")
self.resize(360, 145) if __name__ == '__main__': import sys app = QApplication(sys.argv)
dialog = Dialog()
dialog.show();
sys.exit(app.exec_())

PyQt5在QWidget窗体中显示Qwidget的自定义类(补:完美解决)的更多相关文章

  1. QWidget窗体中使用Q_OBJECT后无法添加背景图片或背景色

    在继承自QWiget的窗体中,设置背景图片或背景色比较简单的方法是使用setStyleSheet()函数,比如在构造函数中可以这样来设置背景图片: this->setStyleSheet(&qu ...

  2. wpf 窗体中显示当前系统时间

    先看一下效果: 这其实是我放置了两个TextBlock,上面显示当前的日期,下面显示时间. 接下来展示一下代码: 在XAML中: <StackPanel Width="205" ...

  3. 在chrome浏览器和在IE浏览器中显示的页面样式不一样的解决办法

    在IE浏览器中添加 一行代码即可:<meta http-equiv="X-UA-Compatible" content="IE=edge" /> 位 ...

  4. 自定义的类型放入STL的set中,需要重载自定义类中的“<”符号(转)

    在以前学习STL的时候,曾经学到过,如果要将自定义的类型放入到set中的话,就需要重载“<”符号,原因是set是一个有序的集合,集合会按照“<”比较的大小,默认按照从小到大的顺序排列.假设 ...

  5. IDEA中如何导入jar包、IDEA中找不到对应类改怎样解决?(详细图解过程)

    今天突然心血来潮.用IDEA运行之前用eclipse编写的项目.发现遇到了一些bug,现在习惯了使用maven管理项目的依赖.一时间忘记了怎样将jar包导入项目中.特此记录一下 文章目录 1.未加入j ...

  6. C#操作数据库,将其查查出来的记录条数显示在winform窗体中的方法之一

    //1.数据库链接的基本操作(略) //2.创建对象函数(关键部分) sqlConn.Open(); //初始化定义记录条数 ; object obj = sqlComm.ExecuteScalar( ...

  7. winfrom向窗体中拖放图片并显示

    首先要设置窗体的AllowDrop属性为true.然后在窗体的DragEnter事件中添加如下代码:调用自定义的显示图片的方法. #region "在用鼠标将某项拖放到区域时事件" ...

  8. Winforn中DevExpress的TreeList中显示某路径下的所有目录和文件(附源码下载)

    场景 Winform中DevExpress的TreeList的入门使用教程(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  9. 在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体

    在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体 在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体ShowAllPage sAllPage = new ShowAllPage();   ...

随机推荐

  1. 转:java 委托

    委托模式是软件设计模式中的一项基本技巧.在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理.委托模式是一项基本技巧,许多其他的模式,如状态模式.策略模式.访问者模式 ...

  2. 定制controller转场动画

    定制controller转场动画 从iOS7开始就可以自由定制控制器间的转场动画了,以下实例描述最简单的定制方式,达到的效果如下所示: 为了实现这个效果需要这么多的文件-_-!!!! RootView ...

  3. Python学习---模拟微信网页登录180410

    WEB微信 网页登录的猜想: a. 访问页面出现二维码 b. 长轮询监听是否已经扫码并且点击确认 c. 如何进行会话保持 d. 如何获取用户列表 e. 如何发送消息(接收消息) 过程:访问微信官网[h ...

  4. Linux 系统级别优化_【all】

    Linux 系统优化 1.Linux系统关闭SELinux 2.Linux系统开机到登录之前启动流程 3.Linux系统设置运行级别 4.Linux系统重要的开机自启动的服务 5.Linux查看系统当 ...

  5. 铁乐学Python_day04-列表LIST

    文:铁乐与猫 2018-3-21 Python内置的一种数据类型是列表:list. list是一种有序的集合,可以随时添加和删除其中的元素. 序列中的每个元素都分配一个数字(下标) - 它的位置,或索 ...

  6. Mysql 漏洞利用(越权读取文件,实战怎么从低权限拿到root密码)[转]

    cnrstar (Be My Personal Best!) | 2014-05-20 21:58 众所周知,Mysql的用户在没有File权限情况下是无法通过Load_file读文件或者通过into ...

  7. idea html热部署

    IDEA SpringBoot 热部署+html修改无需make自动刷新 收藏 HeyS1 发表于 3个月前 阅读 310 收藏 2 点赞 0 评论 0 特邀IBM大咖的主题沙龙,5月20日·北京·3 ...

  8. docker学习笔记:简单构建Dockerfile【Docker for Windows】

    参考与入门推荐:https://www.cnblogs.com/ECJTUACM-873284962/p/9789130.html#autoid-0-0-9 最近学习docker,写一个简单构建Doc ...

  9. Python3中内置类型bytes和str用法及byte和string之间各种编码转换

    Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str ...

  10. 1.1 What Is This Book About(这本书是关于什么的)

    CHAPTER 1 Preliminaries(预备知识) 1.1 What Is This Book About?(这本书是关于什么的) 这本书关心的是如何用Python对数据进行处理和清洗等操作. ...