PyQt5窗口操作大全

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章