pyside6圆角窗口与鼠标拖动

pyside6圆角窗口与鼠标拖动

yuzhiblue

2024年11月20日 23:30

author

最终效果

圆角窗口

实现圆角窗口要做以下两件事

设置窗口样式

# 透明背景
self.setAttribute(Qt.WA_TranslucentBackground)
# 无边框
self.setWindowFlag(Qt.WindowType.FramelessWindowHint)
# 通过 qss 设置背景和圆角
self.setStyleSheet("Window{background-color:gray;border-radius:5px;}")

重载​​paintEvent​

opt = QStyleOption()
opt.initFrom(self)
p = QPainter(self)
self.style().drawPrimitive(QStyle.PE_Widget, opt, p, self)
super().paintEvent(event)

重载的目的是为了让窗口使用设置的QSS去绘制背景。

实现鼠标拖动

def mousePressEvent(self, event: PySide6.QtGui.QMouseEvent) -> None:
    if event.button() == Qt.LeftButton:
        self.mouse_start_pt = event.globalPosition().toPoint()
        self.window_pos = self.frameGeometry().topLeft()
        self.drag = True
def mouseMoveEvent(self, event: PySide6.QtGui.QMouseEvent) -> None:
    if self.drag:
        distance = event.globalPosition().toPoint() - self.mouse_start_pt
        self.move(self.window_pos + distance)

def mouseReleaseEvent(self, event: PySide6.QtGui.QMouseEvent) -> None:
    if event.button() == Qt.LeftButton:
        self.drag = False

完整的代码

import PySide6
from PySide6.QtGui import QIntValidator, Qt, QPainter
from PySide6.QtWidgets import QApplication, QWidget, \
    QVBoxLayout, QHBoxLayout, QLabel, QButtonGroup, \
    QPushButton, QCheckBox, QLineEdit, QStyleOption, QStyle


class CheckBoxGroup(QButtonGroup):
    def checkedId(self) -> list[int]:
        lst = []
        for btn in self.buttons():
            if btn.isChecked():
                lst.append(self.id(btn))

        return lst


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.drag = None
        self.window_pos = None
        self.mouse_start_pt = None
        self.__set_up_ui()

    def paintEvent(self, event: PySide6.QtGui.QPaintEvent) -> None:
        opt = QStyleOption()
        opt.initFrom(self)
        p = QPainter(self)
        self.style().drawPrimitive(QStyle.PE_Widget, opt, p, self)
        super().paintEvent(event)

    def __set_up_ui(self):
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.setWindowFlag(Qt.WindowType.FramelessWindowHint)
        self.setStyleSheet("Window {background-color:gray;border-radius:5px;}")

        v_box = QVBoxLayout(self)
        v_box.addWidget(QLabel("你的职业是:"))
        h_box = QHBoxLayout()
        v_box.addLayout(h_box)
        lst = [
            QCheckBox("程序员"),
            QCheckBox("程序媛"),
            QCheckBox("程序猿"),
            ]
        qbg = CheckBoxGroup(self)
        qbg.setExclusive(False)
        self.qgb = qbg
        _id = 1
        for qrb in lst:
            h_box.addWidget(qrb)
            qbg.addButton(qrb, _id)
            _id += 1

        btn = QPushButton("获取职业")
        btn.clicked.connect(lambda: print(self.qgb.checkedId()))
        v_box.addWidget(btn)

        le = QLineEdit()
        le.setValidator(QIntValidator())

    def mousePressEvent(self, event: PySide6.QtGui.QMouseEvent) -> None:
        if event.button() == Qt.LeftButton:
            self.mouse_start_pt = event.globalPosition().toPoint()
            self.window_pos = self.frameGeometry().topLeft()
            self.drag = True
    def mouseMoveEvent(self, event: PySide6.QtGui.QMouseEvent) -> None:
        if self.drag:
            distance = event.globalPosition().toPoint() - self.mouse_start_pt
            self.move(self.window_pos + distance)

    def mouseReleaseEvent(self, event: PySide6.QtGui.QMouseEvent) -> None:
        if event.button() == Qt.LeftButton:
            self.drag = False

app = QApplication([])
w = Window()
w.show()
app.exec()

专业办理低费率POS机,使用稳定,不乱涨价,不乱扣费,微信联系salesleads

版权声明:本站文章大部分为原创文章,如需转载请提前联系站长获得授权;本站部分内容源自网络,本站承诺绝不用于商业用途,如有冒犯请联系站长删除,谢谢。站长微信:salesleads 本站公众号:企泰7TEC,敬请关注!本文链接:https://7tec.cn/detail/249

抖音快手直播伴侣定时下播助手,无需人工值守,直播利器!免费下载试用!

相关推荐