【概览】

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. 在 Azure 中备份 Linux 虚拟机

    可以通过定期创建备份来保护数据. Azure 备份可创建恢复点,这些恢复点存储在异地冗余的恢复保管库中. 从恢复点还原时,可以还原整个 VM,或只是还原特定的文件. 本文介绍如何将单个文件还原到运行 ...

  2. 分别用C/C++ 和 C#实现简单的观察者模式

    网上找了很多关于观察者模式的代码例子和文章,都写的比较复杂,我个人还是喜欢从易到难,今天自己参考网上资料,也写了一个简单观察者模式的例子,简单的复习了一下Observer 模式,Observer 模式 ...

  3. python基础_特殊符号

    #\n 回车符 #\r 换行符 #\s 空格 #\t tab符号,不知道?开个txt文本,然后按电脑的tab键,就是caps lock上面那个,卧槽,看到一个大长空格(也可能是个超短空格),这个就是t ...

  4. 铁乐学python_Day43_协程

    铁乐学python_Day43_协程 引子 之前我们学习了线程.进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位. 按道理来说我们已经算是把cpu的利用率提高很多了. ...

  5. Session攻击

    1.简介 Session对于Web应用无疑是最重要的,也是最复杂的.对于web应用程序来说,加强安全性的第一条原则就是 – 不要信任来自客户端的数据,一定要进行数据验证以及过滤,才能在程序中使用,进而 ...

  6. AbstractApplicationContext 笔记

    一.这个类的属性 public abstract class AbstractApplicationContext extends DefaultResourceLoader implements C ...

  7. hadoop学习;hdfs操作;执行抛出权限异常: Permission denied;api查看源代码方法;源代码不停的向里循环;抽象类通过debug查找源代码

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u010026901/article/details/26587251 eclipse快捷键alt+s ...

  8. js之点击值发生变化

    点击值发生变化,应用场景,比如像阿里云那样我通常密码是以******的形式存在,我必须要点击查看,它才会以明文显示. 在实际开发中,比如以智能门锁为例,安装门锁时,有个叫密码输入框的表单,这个是选填项 ...

  9. 【转】matplotlib制图——图例legend

    转自:https://www.cnblogs.com/alimin1987/p/8047833.html import matplotlib.pyplot as pltimport numpy as ...

  10. PAT乙级1005

    1005 继续(3n+1)猜想 (25 分) 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程 ...