【概览】

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. geogebra几何画图工具用法

    1. intersectPath :该命令可以自动“算出”对应多边形的交汇区域 2. 静态文本可以指定到一个对象的中间这样将来动态变化对象大小时也不出现问题 3.export worksheet 4. ...

  2. 小鸡G4工程款 上手体验

    前言:之前只是抱着试一试的态度在小鸡活动贴下报名,说实话之前并没有抱希望能够没选中.所以非常感谢小鸡团队给我的这次机会.这应该是我第一次参与厂家的内测活动.希望能给小鸡团队,给广大玩家带来一片实用的上 ...

  3. 使用CocoaPods

    使用CocoaPods 1. 安装CocoaPods 有时候,默认的 https://rubygems.org/ 访问不了,你需要先执行以下命令移除掉sources gem sources -r ht ...

  4. 鸟哥私房菜vim常用命令

    第一部份:一般模式可用的按钮说明,光标移动.复制贴上.搜寻取代等 移动光标的方法 h 或 向左箭头键(←) 光标向左移动一个字符 j 或 向下箭头键(↓) 光标向下移动一个字符 k 或 向上箭头键(↑ ...

  5. (1)List集合 (2)Queue集合 (3)Set集合

    1.List集合(重中之重)1.1 基本概念 java.util.List接口是Collection接口的子接口,该接口中元素有先后放入次序并允许重复 该接口的主要实现类:ArrayList类.Lin ...

  6. September 19th 2017 Week 38th Tuesday

    Live boldly. Push yourself. Don't settle. 勇敢生活,突破自我,永不设限! Don't indulge in the past, whether it was ...

  7. November 17th 2016 Week 47th Thursday

    Don't cry because it is over. Smile because it happened. 不要因为结束而哭泣:微笑吧,因为我们曾经拥有. My ex-girlfriend ha ...

  8. JVM(一)Java内存模型

    前言 对于从事C.C++程序开发的开发人员来说,在开始使用对象之前,他们都需要使用new关键字为对象申请内存空间,在使用完对象之后,也需要使用delete关键字来释放对象占用的内存空间.对于Java程 ...

  9. PAT乙级1016

    1016 部分A+B (15 分)   正整数 A 的“D​A​​(为 1 位整数)部分”定义为由 A 中所有 D​A​​ 组成的新整数 P​A​​.例如:给定 A=3862767,D​A​​=6,则 ...

  10. ZOJ 3203 Light Bulb (三分+计算几何)

    B - Light Bulb Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit ...