QWidget
QWidget是pyqt中所有可视化控件的基类
QWidget创建.py
import sys
from PyQt5.Qt import *
# Qwidget是所有可视控件的基类
app = QApplication(sys.argv)
win = QWidget()
win.show()
sys.exit(app.exec_())
Qwidget位置api.py
import sys
from PyQt5.Qt import *
# Qwidget是所有可视控件的基类
app = QApplication(sys.argv)
win = QWidget()
# move移动窗口相对桌面位置
win.move(100, 100)
# 设置窗口大小
win.resize(200, 200)
# 调整窗口大小
# win.setGeometry(x, y, width, height)
# 根据内容自适应大小
# win.adjustSize()
# 设置固定尺寸
# win.setFixedSize()
win.show()
sys.exit(app.exec_())
Qwidget尺寸信息.py
import sys
from PyQt5.Qt import *
# Qwidget是所有可视控件的基类
app = QApplication(sys.argv)
win = QWidget()
win.move(100, 100)
win.resize(200, 200)
# 控件显示之前
print('x', win.x())
print('y', win.y())
print('pos', win.pos())
print('width', win.width())
print('height', win.height())
print('size', win.size())
print('geometry', win.geometry())
print('rect', win.rect())
print('frameSize', win.frameSize())
print('frameGeometry', win.frameGeometry())
win.show()
# 控件显示之后
print('-' * 100)
print('x', win.x())
print('y', win.y())
print('pos', win.pos())
print('width', win.width())
print('height', win.height())
print('size', win.size())
print('geometry', win.geometry())
print('rect', win.rect())
print('frameSize', win.frameSize())
print('frameGeometry', win.frameGeometry())
sys.exit(app.exec_())
QWidget最大最小尺寸.py
import sys
from PyQt5.Qt import *
# 获取最大最小尺寸api
# minimumWidth()
# minimumHeight()
# minimumSize()
# maximumWidth()
# maximumHeight()
# maximumSize()
# 设置最大最小尺寸api
# setMinimumWidth()
# setMinimumHeight()
# setMinimumSize()
# setMaximumWidth()
# setMaximumHeight()
# setMaximumSize()
class Window(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setMinimumSize(300, 300)
self.setMaximumSize(500, 500)
self.do_something()
def do_something(self):
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec_())
QWidget内容边距.py
import sys
from PyQt5.Qt import *
# setContentsMargins() 设置内容边距(左,上,右,下)
# getContentsMargins() 获取内容边距
# contentsRect() 获取内容区域
class Window(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.do_something()
def do_something(self):
label = QLabel(self)
label.setText('hello world')
label.resize(300, 300)
label.setStyleSheet('background-color: cyan;border: 1px solid;')
label.setContentsMargins(100, 100, 100, 100)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec_())
QWidget鼠标操作.py
import sys
from PyQt5.Qt import *
# setCursor()设置鼠标形状
# unsetCursor()重置鼠标形状
class Window(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.do_something()
def do_something(self):
pass
# 该事件在鼠标左键按下且移动后触发
def mouseMoveEvent(self, evt):
print('mouseMoveEvent', evt.localPos())
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
# win.setCursor(Qt.BusyCursor)
# 通过图片自定义鼠标形状
# pixmap = QPixmap('./QQ截图20220324145321.png')
# pixmap = pixmap.scaled(10, 10)
# cursor = QCursor(pixmap, 0, 0)
# win.setCursor(cursor)
# 设置鼠标位置
# current_cursor = win.cursor()
# print(current_cursor.pos())
# current_cursor.setPos(0, 0)
# 设置MouseTracking后,不需要点击左键,移动即可触发mouseMoveEvent事件
print(win.hasMouseTracking())
win.setMouseTracking(True)
win.show()
sys.exit(app.exec_())
QWidget焦点控制.py
import sys
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.do_something()
def do_something(self):
pass
def mousePressEvent(self, evt):
self.focusNextChild()
# self.focusPreviousChild()
# self.focusNextPrevChild(True)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
le1 = QLineEdit(win)
le2 = QLineEdit(win)
le3 = QLineEdit(win)
le4 = QLineEdit(win)
le1.move(50, 50)
le2.move(50, 100)
le3.move(50, 150)
le4.move(50, 200)
# le2.setFocus()
# le2.setFocusPolicy(Qt.TabFocus)
# le2.setFocusPolicy(Qt.ClickFocus)
le2.setFocusPolicy(Qt.NoFocus)
le2.clearFocus()
win.show()
sys.exit(app.exec_())
QWidget事件操作.py
import sys
from PyQt5.Qt import *
# https://www.bilibili.com/video/BV1iD4y1D7C8?p=43
class Window(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.do_something()
def do_something(self):
pass
# 创建和缩小之后展示都会触发
def showEvent(self, evt):
print('窗口展示')
def closeEvent(self, evt):
print('窗口关闭')
def moveEvent(self, evt):
print('窗口移动')
def resizeEvent(self, evt):
print('size 改变')
def enterEvent(self, evt):
print('鼠标进入')
def leaveEvent(self, evt):
print('鼠标离开')
def mousePressEvent(self, evt):
print('鼠标按下')
def mouseReleaseEvent(self, evt):
print('鼠标释放')
def mouseDoubleClickEvent(self, evt):
print('鼠标双击')
def mouseMoveEvent(self, evt):
print('鼠标移动')
def keyPressEvent(self, evt):
print('键位按下')
def keyReleaseEvent(self, evt):
print('键位释放')
def focusInEvent(self, evt):
print('获取焦点')
def focusOutEvent(self, evt):
print('失去焦点')
def dragEnterEvent(self, evt):
print('拖拽进入控件')
def dragLeaveEvent(self, evt):
print('拖拽离开控件')
def dragMoveEvent(self, evt):
print('拖拽在控件内移动')
def dropEvent(self, evt):
print('拖拽放下时调用')
def paintEvent(self, evt):
print('绘制事件')
def changeEvent(self, evt):
print('窗体改变、字体改变调用')
def contextMenuEvent(self, evt):
print('右键菜单调用')
def inputMethodEvent(self, evt):
print('输入法调用')
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec_())
QWidget事件转发机制.py
import sys
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.resize(500, 500)
self.do_something()
def do_something(self):
pass
def mousePressEvent(self, evt):
print('顶层窗口按下')
class MidWindow(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.resize(200, 200)
self.do_something()
def do_something(self):
self.setAttribute(Qt.WA_StyledBackground, True)
self.setStyleSheet('border:1px solid;')
def mousePressEvent(self, evt):
print('中层窗口按下')
# evt.accept() 接收事件不在向父类传递
# evt.ignore() 忽略事件继续向父类传递
# print(evt.isAccepted()) 判断是否接收事件
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
mid_win = MidWindow(win)
win.show()
sys.exit(app.exec_())
QWidget层级关系.py
import sys
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.resize(500, 500)
self.do_something()
def do_something(self):
pass
class Lable(QLabel):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.do_something()
def do_something(self):
pass
def mousePressEvent(self, evt):
self.raise_()
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
label1 = Lable(win)
label2 = Lable(win)
label1.setText('label1')
label2.setText('label2')
label1.resize(100, 100)
label2.resize(100, 100)
label2.move(50, 50)
label1.setStyleSheet('background-color: cyan;')
label2.setStyleSheet('background-color: green;')
# # 把对象降至最下层
# label2.lower()
# # 把对象升至最上层
# label1.raise_()
# 把label2放置于label1下
label2.stackUnder(label1)
win.show()
sys.exit(app.exec_())
QWidget窗口特定操作.py
import sys
from PyQt5.Qt import *
if __name__ == '__main__':
app = QApplication(sys.argv)
win = QWidget()
# 设置图标
icon = QIcon('./QQ截图20220324145321.png')
win.setWindowIcon(icon)
# 设置\获取标题
win.setWindowTitle('window')
print(win.windowTitle())
# 设置\获取透明度
win.setWindowOpacity(0.5)
print(win.windowOpacity())
# 设置\获取窗口状态。
# Qt.WindowNoState 无状态
# Qt.WindowMinimized 最小化
# Qt.WindowMaximized 最大化
# Qt.WindowFullScreen 全屏
# Qt.WindowActive 活动窗口
# win.setWindowState()
print(win.windowState())
# win.showMaximized()
# win.showMinimized()
# win.showFullScreen()
# win.showNormal()
# win.isMinimized()
# win.isMaximized()
# win.isFullScreen()
win.show()
sys.exit(app.exec_())
QWidget控件交互.py
import sys
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.do_something()
def do_something(self):
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
btn = QPushButton(win)
btn.setText('点击')
btn.pressed.connect(lambda: btn.hide())
# 设置按钮不可被点击
# btn.setEnabled(False)
# print(btn.isEnabled())
# btn.show()
# btn.hide()
# btn.setVisible(False)
# btn.setHidden(True)
# isVisible最终是否可见,isHidden对于父控件来说是否隐藏
# print(btn.isVisible())
# print(btn.isHidden())
# 设置窗口编辑状态
# win.setWindowTitle('交互状态[*]')
# win.setWindowModified(True)
# print(win.isWindowModified())
win.show()
win2 = Window()
win2.show()
print(win2.isActiveWindow())
sys.exit(app.exec_())
案例
pyqt-案例01-设置尺寸.py
import sys
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.move(300, 300)
self.resize(500, 500)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec_())
pyqt-案例02-九宫格摆放.py
import sys
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.move(300, 300)
self.resize(500, 500)
self.do_something()
def do_something(self):
width = self.width() / 3
height = self.height() / 3
for i in range(0, 3):
for j in range(0, 3):
label = QLabel(self)
label.setText(f'第{(i + 1) * (j + 1)}个控件')
label.move(i * width, j * height)
label.resize(width, height)
label.setStyleSheet('border: 1px solid')
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec_())
pyqt-案例03-鼠标跟随.py
import sys
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.resize(500, 500)
self.do_something()
def do_something(self):
self.label = QLabel(self)
self.label.setStyleSheet('background-color: cyan')
self.label.resize(100, 100)
def mouseMoveEvent(self, evt):
self.label.move(evt.localPos().x(), evt.localPos().y())
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec_())
pyqt-案例04-鼠标进入移出.py
import sys
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.resize(500, 500)
self.do_something()
def do_something(self):
pass
class Lable(QLabel):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.do_something()
def do_something(self):
pass
def enterEvent(self, evt):
self.setText('欢迎光临')
def leaveEvent(self, evt):
self.setText('谢谢惠顾')
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
label = Lable(win)
label.resize(200, 200)
label.setStyleSheet('background-color: cyan;')
win.show()
sys.exit(app.exec_())
pyqt-案例05-监听键盘按键.py
import sys
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.resize(500, 500)
self.do_something()
def do_something(self):
pass
class Lable(QLabel):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.do_something()
def do_something(self):
pass
def keyPressEvent(self, evt):
print(evt)
if evt.key() == Qt.Key_A:
print('a被点击了')
if evt.modifiers() == Qt.ControlModifier and evt.key() == Qt.Key_S:
print('ctrl+S被点击')
if evt.modifiers() == Qt.ShiftModifier | Qt.AltModifier and evt.key() == Qt.Key_S:
print('shift+alt+S被点击')
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
label = Lable(win)
label.resize(200, 200)
label.setStyleSheet('background-color: cyan;')
# grabKeyboard开启之后label会监听键盘输入
label.grabKeyboard()
win.show()
sys.exit(app.exec_())
pyqt-案例06-用户区拖动窗口.py
import sys
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.resize(500, 500)
self.move_flag = False
self.do_something()
def do_something(self):
pass
def mousePressEvent(self, evt):
if evt.button() == Qt.LeftButton:
self.move_flag = True
self.mouse_x = evt.globalX()
self.mouse_y = evt.globalY()
self.origin_x = self.x()
self.origin_y = self.y()
def mouseReleaseEvent(self, evt):
if evt.button() == Qt.LeftButton:
self.move_flag = False
def mouseMoveEvent(self, evt):
if self.move_flag:
self.move(self.origin_x + evt.globalX() - self.mouse_x, self.origin_y + evt.globalY() - self.mouse_y)
self.mouse_x = evt.globalX()
self.mouse_y = evt.globalY()
self.origin_x = self.x()
self.origin_y = self.y()
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
win.setMouseTracking(True)
win.show()
sys.exit(app.exec_())
pyqt-案例07-父子关系扩充.py
import sys
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.resize(500, 500)
self.do_something()
def do_something(self):
pass
def mousePressEvent(self, evt):
local_x = evt.x()
local_y = evt.y()
sub_widget = self.childAt(local_x, local_y)
if sub_widget is not None:
sub_widget.setStyleSheet('background-color:red;')
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
for i in range(0, 3):
label = QLabel(win)
label.setText(f'第{i + 1}个控件')
label.move(100 * i, 100 * i)
win.show()
sys.exit(app.exec_())
pyqt-案例08-边框设置.py
import sys
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self, *args, **kwargs):
super(Window, self).__init__(*args, **kwargs)
self.setWindowFlags(Qt.FramelessWindowHint)
self.setWindowOpacity(0.8)
self.resize(500, 500)
self.move_flag = False
self.do_something()
def do_something(self):
self.btn_width = 50
self.btn_height = 20
self.closeBtn = QPushButton(self)
self.miniBtn = QPushButton(self)
self.maxBtn = QPushButton(self)
self.closeBtn.setText('关闭')
self.miniBtn.setText('最小化')
self.maxBtn.setText('最大化')
self.closeBtn.resize(self.btn_width, self.btn_height)
self.miniBtn.resize(self.btn_width, self.btn_height)
self.maxBtn.resize(self.btn_width, self.btn_height)
def max_normal():
print(self.isMaximized())
if self.isMaximized():
self.showNormal()
self.maxBtn.setText('最大化')
else:
self.showMaximized()
self.maxBtn.setText('恢复')
self.closeBtn.pressed.connect(self.close)
self.miniBtn.pressed.connect(self.showMinimized)
self.maxBtn.pressed.connect(max_normal)
def resizeEvent(self, evt):
self.closeBtn.move(self.width() - self.btn_width, 0)
self.maxBtn.move(self.width() - self.btn_width * 2, 0)
self.miniBtn.move(self.width() - self.btn_width * 3, 0)
def mousePressEvent(self, evt):
if evt.button() == Qt.LeftButton:
self.move_flag = True
self.mouse_x = evt.globalX()
self.mouse_y = evt.globalY()
self.origin_x = self.x()
self.origin_y = self.y()
def mouseReleaseEvent(self, evt):
if evt.button() == Qt.LeftButton:
self.move_flag = False
def mouseMoveEvent(self, evt):
if self.move_flag:
self.move(self.origin_x + evt.globalX() - self.mouse_x, self.origin_y + evt.globalY() - self.mouse_y)
self.mouse_x = evt.globalX()
self.mouse_y = evt.globalY()
self.origin_x = self.x()
self.origin_y = self.y()
if __name__ == '__main__':
app = QApplication(sys.argv)
# win = QWidget(flags=Qt.FramelessWindowHint)
win = Window()
win.show()
sys.exit(app.exec_())
pyqt-案例09-控件交互.py
import sys
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self, *args, **kwargs):
super(Window, self).__init__(*args, **kwargs)
self.resize(500, 500)
self.do_something()
def do_something(self):
label = QLabel(self)
text = QLineEdit(self)
btn = QPushButton(self)
btn.setText('点击')
btn.setEnabled(False)
label.setText('label')
label.hide()
def text_change(t):
print(t)
if len(t) > 0:
btn.setEnabled(True)
else:
btn.setEnabled(False)
text.textChanged.connect(text_change)
def btn_pressed():
if text.text() == 'uu':
label.show()
label.setText('success')
else:
label.show()
label.setText('fail')
btn.pressed.connect(btn_pressed)
label.move(50, 50)
text.move(50, 100)
btn.move(50, 150)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec_())
pyqt-案例10-状态栏.py
import sys
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self, *args, **kwargs):
super(Window, self).__init__(*args, **kwargs)
self.resize(500, 500)
self.do_something()
def do_something(self):
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
# win = Window()
win = QMainWindow()
win.statusBar()
win.setStatusTip('这是窗口')
label = QLabel(win)
label.setText('标签')
label.setStatusTip('这是标签')
label.setToolTip('这是提示标签')
label.setToolTipDuration(2000)
win.show()
sys.exit(app.exec_())