1、多窗口交互-使用信号与槽函数
'''
如果一个窗口和一个窗口交互,尽量不要访问窗口B的控件;
应该访问与信号绑定的槽函数,从而降低窗口之间的耦合度 例:如果A直接访问B窗口的控件,一旦B窗口的控件发生改变,则A和B的代码都需发生变化 如果A访问B中的信号,则B靠近发生改变,则只需要改变B中的代码,而不需要改变A的代码 核心思想:
1、先设计好子窗口,并且在子窗口里面要定义整体信号signal,并且定义触发信号的函数
2、在主窗口代码里面要定义好一个自窗口的对象ZWindow(),并且将其信号连接主函数
3、主窗口一定要有一个控件,关联打开子窗口的函数
4、在主窗口代码中要定义好打开子窗口的函数def openZIWindow(self)
''' from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from DateDailog import DateDialog
import sys
class MU(QWidget):
def __init__(self):
super(MU,self).__init__()
self.setWindowTitle("多窗口交互-信号与槽") self.line=QLineEdit()
self.b=QPushButton("打开按钮")
self.b.clicked.connect(self.opendialog) 打开子窗口按钮控件定义
self.layout=QVBoxLayout()
self.layout.addWidget(self.b)
self.layout.addWidget(self.line)
self.setLayout(self.layout) def opendialog(self):
d=DateDialog(self)
d.datetime.dateTimeChanged.connect(self.showdate1) #方法1直接导入模块使用控件方法
d.signal.connect(self.showdate2) #方法2使用信号连接也可以
d.show() def showdate1(self,date):
self.line.setText(date.toString()) def showdate2(self,date):
self.line.setText(date) if __name__=="__main__":
app=QApplication(sys.argv)
p=MU()
p.show()
sys.exit(app.exec_())
子窗口类定义代码:
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import * class DateDialog(QDialog):
signal=pyqtSignal(str) def __init__(self,parent=None):
super(DateDialog,self).__init__(parent)
self.setWindowTitle("QDateDialog") layout=QVBoxLayout()
self.datetime=QDateTimeEdit()
self.datetime.setCalendarPopup(True)
self.datetime.setDateTime(QDateTime.currentDateTime()) self.datetime1 = QDateTimeEdit()
self.datetime1.setCalendarPopup(True)
self.datetime1.setDateTime(QDateTime.currentDateTime()) layout.addWidget(self.datetime)
layout.addWidget(self.datetime1) button=QDialogButtonBox(QDialogButtonBox.Ok |QDialogButtonBox.Cancel)
button.accepted.connect(self.accept) #关联系统接受方法
button.rejected.connect(self.reject) #关联系统拒绝方法 self.datetime1.dateTimeChanged.connect(self.emit1)
layout.addWidget(button)
self.setLayout(layout) def dateTime(self):
return self.datetime.dateTime() #获取到当前的日期和时间 #触发信号函数
def emit1(self):
d=self.datetime1.dateTime().toString()
self.signal.emit(d) #定义一个静态方法
@staticmethod
def getdatetime(parent=None):
dailog=DateDialog(parent)
#显示这个窗口
result=dailog.exec() #显示窗口的状态,接收或者不接受
date=dailog.dateTime()
return (date.date(),date.time(),result==QDialog.Accepted)

2、多窗口交互-不使用信号与槽
'''
不使用信号与槽函数的方式一
Win1与Win2之间的交互
相互之间直接访问窗口上的控件,属于一种强烈耦合的方式交互 核心思想:
1、先在窗口2中导入窗口1定义好的类;
2、在窗口2的代码中定义窗口1的类
3、直接将窗口2中的控件信号连接窗口2类的方法 '''
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys #DateDailog窗口类先定义好
from DateDailog import DateDialog #导入类的方式相互之间访问 class Mulwindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("多窗口交互:不使用信号与槽函数") self.line=QLineEdit(self)
self.b1=QPushButton("弹出对话框1")
self.b1.clicked.connect(self.onb1) self.b2=QPushButton("弹出对话框2")
self.b2.clicked.connect(self.onb2) g=QGridLayout()
g.addWidget(self.line)
g.addWidget(self.b1)
g.addWidget(self.b2)
self.setLayout(g) def onb1(self):
dialog=DateDialog(self)
result=dialog.exec() #先要显示第一个窗口
date=dialog.dateTime()
self.line.setText(date.date().toString()) #显示出来日期,转为字符串
dialog.destroy() #销毁窗口 def onb2(self): date,time,result=DateDialog.getdatetime()
self.line.setText(date.toString()) if result==QDialog.Accepted: #如果点击接受方法
print("点击确定按钮")
else: #如果点击拒绝方法
print("点击取消按钮") if __name__=="__main__":
app=QApplication(sys.argv)
p=Mulwindow()
p.show()
sys.exit(app.exec_())

3、设置窗口样式
'''
窗口的样式设置,可以使用一定的方法
''' from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys class Windowpattern(QMainWindow):
def __init__(self):
super(Windowpattern,self).__init__()
self.setWindowTitle("设置窗口样式")
self.resize(500,260) self.setWindowFlags(Qt.WindowMaximizeButtonHint | Qt.WindowStaysOnTopHint) #设置窗口样式,另外 Qt.FramelessWindowHint是指无边框窗口
self.setObjectName("mainwindow") #窗口ID名称,后续直接可以进行访问和使用
self.setStyleSheet("#mainwindow{border-image:url(image/python.png);}") #设置窗口显示图片,即背景图片 if __name__=="__main__":
app=QApplication(sys.argv)
p=Windowpattern()
p.show()
sys.exit(app.exec_())

4、设置窗口风格
'''
窗口的绘图与特效,设置窗口风格QApplication.setStyle(...)
设置窗口中控件的风格
''' from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5 import QtCore
import sys print(QStyleFactory.keys()) class Window(QWidget):
def __init__(self):
super(Window,self).__init__()
self.setWindowTitle("设置窗口风格")
h=QHBoxLayout() self.stylelabel=QLabel("设置窗口风格")
self.styleComboBox=QComboBox()
self.styleComboBox.addItems(QStyleFactory.keys()) #获取当前窗口的显示风格
print(QApplication.style().objectName()) index=self.styleComboBox.findText(QApplication.style().objectName(),QtCore.Qt.MatchFixedString)
self.styleComboBox.setCurrentIndex(index) #将所选窗口风格与展示函数连接
self.styleComboBox.activated[str].connect(self.handlestylechanged) h.addWidget(self.stylelabel)
h.addWidget(self.styleComboBox)
self.setLayout(h) def handlestylechanged(self,style):
QApplication.setStyle(style) if __name__=="__main__": app=QApplication(sys.argv)
p=Window()
p.show()
sys.exit(app.exec_())

5、代码实现窗口的最大化与最小化
'''
窗口的最大化与最小化
'''
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys class Windowmaxmin(QWidget):
def __init__(self):
super(Windowmaxmin,self).__init__()
self.setWindowTitle("设置窗口最大化与最小化")
self.resize(500,260) #设置实现窗口的最大化与最小化以及关闭按钮功能
self.setWindowFlags(Qt.WindowMaximizeButtonHint|Qt.WindowMinimizeButtonHint|Qt.WindowCloseButtonHint) #使得窗口充满整个桌面
self.b1=QPushButton("窗口最大化1")
self.b1.clicked.connect(self.maxwindow)
#利用内置的函数来进行最大化展示窗口
self.b2=QPushButton("窗口最大化2")
self.b2.clicked.connect(self.showMaximized)
#利用内置的函数来进行最小化展示窗口
self.b3=QPushButton("窗口最小化")
self.b3.clicked.connect(self.showMinimized) layout=QVBoxLayout()
layout.addWidget(self.b1)
layout.addWidget(self.b2)
layout.addWidget(self.b3)
self.setLayout(layout) def maxwindow(self):
desktop=QApplication.desktop()
#获取桌面可用尺寸
rect=desktop.availableGeometry()
self.setGeometry(rect) if __name__=="__main__":
app=QApplication(sys.argv)
p=Windowmaxmin()
p.show()
sys.exit(app.exec_())

7、实现窗口白板绘图程序-项目实践
'''
窗口绘图
1、如何绘图
在painEvent中绘图,使用update方法来触发painevent的调用
2、在哪里绘图
在白色背景得到对象中绘制图像
3、如何通过鼠标实现绘图
按住鼠标左键进行绘图,左键抬起则不绘制
鼠标拥有三个事件:
鼠标按下mousePressEvent
鼠标移动mouseMoveEvent
鼠标抬起mouseReleaseEvent '''
from PyQt5.QtCore import Qt,QPoint
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtGui import QPainter,QPixmap
import sys class Windowpaint(QWidget):
def __init__(self,parent=None):
super(Windowpaint,self).__init__(parent)
self.setWindowTitle("窗口实现绘图功能")
self.pix=QPixmap()
self.lastpoint=QPoint()
self.endpoint=QPoint()
self.initUI() def initUI(self):
self.resize(1000,1000) #画布大小为1000*1000,背景为白色
self.pix=QPixmap(1000,1000) #创建图像
self.pix.fill(Qt.white) def paintEvent(self, event):
pp=QPainter(self.pix)
#根据鼠标指针前后两个位置绘制直线
pp.drawLine(self.lastpoint,self.endpoint)
#让前一个坐标值等于后一个坐标值
#这样可以实现连续得到线
self.lastpoint=self.endpoint
painter=QPainter(self)
painter.drawPixmap(0,0,self.pix) def mousePressEvent(self, event):
if event.button()==Qt.LeftButton:
self.lastpoint=event.pos() def mouseMoveEvent(self, event):
if event.buttons() and Qt.LeftButton:
self.endpoint=event.pos()
self.update() def mouseReleaseEvent(self, event):
if event.button()==Qt.LeftButton:
self.endpoint=event.pos()
#进行重新绘制
self.update() if __name__=="__main__":
app=QApplication(sys.argv)
p=Windowpaint()
p.show()
sys.exit(app.exec_())

8、创建透明与半透明窗口
'''
透明窗口
'''
from PyQt5.Qt import *
import sys if __name__=="__main__":
app=QApplication(sys.argv)
win=QMainWindow()
win.setWindowTitle("窗口的透明度设置") #窗口的透明度设置函数,0-1,0是全透明,1表示正常不透明的窗口
win.setWindowOpacity(0.6)
button=QPushButton("我的按钮",win) win.resize(400,200)
win.show()
sys.exit(app.exec_())

9、实现异形窗口的方法
'''
通过mask实现异形窗口效果
需要一张透明的png图,透明部分被扣出,形成一个非矩形的形状
''' from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
class windowpattern(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("设置异形窗口")
self.pix=QBitmap("./image/mask.jpg") #需要一张透明的mask图,透明部分被扣出来了
self.resize(self.pix.size())
self.setMask(self.pix) def paintEvent(self,event):
painter=QPainter(self)
painter.drawPixmap(0,0,self.pix.width(),self.pix.height(),QPixmap("./image/1.png")) if __name__=="__main__":
app=QApplication(sys.argv)
p=windowpattern()
p.show()
sys.exit(app.exec_())

PyQt5窗口操作大全的更多相关文章

  1. Delphi Excel 操作大全

    Delphi Excel 操作大全 (一) 使用动态创建的方法首先创建 Excel 对象,使用ComObj:var ExcelApp: Variant;ExcelApp := CreateOleObj ...

  2. Windows窗口消息大全(转)

    Windows窗口消息大全,全不全自己看 ////////////////////////////////////////////////////////////////////////// #inc ...

  3. MATLAB命令大全和矩阵操作大全

    转载自: http://blog.csdn.net/dengjianqiang2011/article/details/8753807 MATLAB矩阵操作大全 一.矩阵的表示在MATLAB中创建矩阵 ...

  4. MATLAB矩阵操作大全

    转载自:http://blog.csdn.net/dengjianqiang2011/article/details/8753807 MATLAB矩阵操作大全 一.矩阵的表示 在MATLAB中创建矩阵 ...

  5. java日期操作大全

    摘自(http://www.blogjava.net/i369/articles/83483.html) java日期操作 大全 先来一个:  取得指定月份的第一天与取得指定月份的最后一天  http ...

  6. PHP数组操作大全

    <?php /** * File: phpstudy : array_test.php * Created by PhpStorm. * User: IhMfLy Pheonix@jtv-070 ...

  7. uCGUI窗口操作要点

    uCGUI窗口操作要点 1. 创建一个窗口的时候,会给此窗口发送“创建(WM_CREATE)”消息,从而执行它的回调函数:如果创建窗口的标志带有“可视标志(WM_CF_SHOW)”,那么在后续执行GU ...

  8. Java 文件操作大全

    Java 文件操作大全 //1.创建文件夹 //import java.io.*; File myFolderPath = new File(str1); try { if (!myFolderPat ...

  9. SQL语句操作大全

    SQL语句操作大全   本文分为以下六个部分: 基础部分 提升部分 技巧部分 数据开发–经典部分 SQL Server基本函数部分 常识部分 一.基础 1.说明:创建数据库CREATE DATABAS ...

随机推荐

  1. 微信h5游戏如何在微信中做好域名防封 防屏蔽的 工作

    最近微信开始大封杀,不知道原因是什么,可能是因为违规网站太多了吧,很多网站都被错杀了,下面我们聊一下怎样才能避免域名被封杀呢. 在各种不同的域名当中,能够做出了更适合的选择,这些对于大家域名防封_域名 ...

  2. 总结下抽象类Abstract和虚方法Virtual(易混点)

    1.普通类中可以有普通方法和虚方法,在被继承时,虚方法可以选择重写(override)或者不重写 2.抽象类中可以有普通方法和虚方法和抽象方法,当被继承时 如下 1.普通方法不能被子类重写 2.虚方法 ...

  3. mysql 同时支持多少连接MYSQL 查看最大连接数和修改最大连接数

    MySQL查看最大连接数和修改最大连接数 1.查看最大连接数 show variables like '%max_connections%'; 2.修改最大连接数 set GLOBAL max_con ...

  4. python 字符串是否包含某个子字符串

    方法如下:以后再整理 if str1 in str2: 包含的话,True if str1.find(str2)>=0: 包含的话,返回第一次出现的位置,没有的话为负数 https://www. ...

  5. swagger2 常用注解的使用

    一.@Api 效果: @Api注解放在类上面,这里的value是没用的,tags表示该controller的介绍. 二 .@ApiOperation 效果: @ApiOperation注解用于放在方法 ...

  6. C++转换构造函数和隐式转换函数

    今天是第一次听到C++还有个转换构造函数,之前经常见到默认构造函数.拷贝构造函数.析构函数,但是从没听说过转换构造函数,隐式转换函数也是一样,C++的确是够博大精深的,再次叹服!          其 ...

  7. bugku 白哥的鸽子

    首先下载之后发现是一个txt 然后更改一下后缀名发现这是一张jpg 图片然后看一下属性然后用hxd分析一下 看看有没有zip 发现没有 然后拖到地下然后发现有一串密码有些问题 然后查一下发现是 栏杆密 ...

  8. centos6.5下安装mysql数据库

    centos6.5下安装mysql数据库 1.安装mysql数据库:yum install mysql-server 2.临时启动数据库:service mysqld start 3.开机启动数据库: ...

  9. 【原】Harbor安装及使用

    一.Harbor简介 Harbor是一个用于存储和分发Docker镜像的企业级私有Registry服务器. 二.Harbor安装 1.下载Harbor包 官网地址:https://github.com ...

  10. 每天进步一点点------FPGA 静态时序分析模型——reg2reg

    2. 应用背景 静态时序分析简称STA,它是一种穷尽的分析方法,它按照同步电路设计的要求,根据电路网表的拓扑结构,计算并检查电路中每一个DFF(触发器)的建立和保持时间以及其他基于路径的时延要求是否满 ...