Qt第三十四章:总结【隐藏标题栏边框、隐藏背景、窗体透明】

news2024/11/19 1:20:25

目录

隐藏标题栏边框

①隐藏标题栏代码:

​编辑②自定义标题栏(可以直接Copy)

使用

隐藏背景

①隐藏背景代码,此时背景上的样式都是无效的。

②自定义背景,通过重写paintEvent事件来完成

中间绘制的部分是我们想要的,只需要将标题栏边框隐藏掉就可以了。 

窗体透明

①窗体透明代码,设置整个窗体的透明度

移动和缩放:隐藏标题栏边框后无法移动和缩放。



隐藏标题栏边框

①隐藏标题栏代码:

class TestWidget(QWidget):
    def __init__(self, parent=None):
        super(TestWidget, self).__init__(parent)
        self.setWindowFlags(
            Qt.Window
            | Qt.FramelessWindowHint
            | Qt.WindowSystemMenuHint
            | Qt.WindowMinimizeButtonHint
            | Qt.WindowMaximizeButtonHint
        )


if __name__ == '__main__':
    app = QApplication([])
    main = TestWidget()
    main.show()
    app.exec()


②自定义标题栏(可以直接Copy)

# 自定义标题栏
class QCustomTitleBar:
    def __init__(self, window: QtWidgets):
        self.window = window
        # 默认标题栏高度 必须设
        self.DEFAULT_TITILE_BAR_HEIGHT = 40
        # 存储父类的双击事件
        self.mouseDoubleClickEvent_parent = self.window.mouseDoubleClickEvent
        # 将本类的双击事件赋值给将父类的双击事件
        self.window.mouseDoubleClickEvent = self.mouseDoubleClickEvent

        # 存储父类的窗口大小改变事件
        self.resizeEvent_parent = self.window.resizeEvent
        # 将本类的窗口大小改变事件赋值给将父类的窗口大小改变事件
        self.window.resizeEvent = self.resizeEvent

        # 设置ui文件里main_layout上边距,以免遮挡标题栏
        self.window.setContentsMargins(0, self.DEFAULT_TITILE_BAR_HEIGHT, 0, 0)

        # 1.设置无边框 和 透明背景 无边框必须设置全,不然会导致点击任务栏不能最小化窗口
        self.window.setWindowFlags(
            Qt.Window
            | Qt.FramelessWindowHint
            | Qt.WindowSystemMenuHint
            | Qt.WindowMinimizeButtonHint
            | Qt.WindowMaximizeButtonHint
        )
        # self.window.setAttribute(Qt.WA_TranslucentBackground)
        # 2.添加自定义的标题栏到最顶部
        self.title = QLabel("", self.window)
        # 3.设置标题栏样式
        self.setStyle()
        # 4.添加按钮
        # 添加关闭按钮
        self.close_btn = QPushButton("", self.window)
        self.close_btn.setGeometry(self.window.width() - 33, 10, 20, 20)
        # 添加最大化按钮
        self.max_btn = QPushButton("", self.window)
        self.max_btn.setGeometry(self.window.width() - 66, 10, 20, 20)
        # 添加最小化按钮
        self.min_btn = QPushButton("", self.window)
        self.min_btn.setGeometry(self.window.width() - 99, 10, 20, 20)
        # 设置三个按钮的鼠标样式
        self.close_btn.setCursor(Qt.PointingHandCursor)
        self.max_btn.setCursor(Qt.PointingHandCursor)
        self.min_btn.setCursor(Qt.PointingHandCursor)
        # 设置三个按钮的样式
        self.close_btn.setStyleSheet(
            "QPushButton{border-image:url('./images/close.png');background:#ff625f;border-radius:10px;}"
            "QPushButton:hover{background:#eb4845;}"
        )
        self.max_btn.setStyleSheet(
            "QPushButton{border-image:url('./images/max.png');background:#ffbe2f;border-radius:10px;}"
            "QPushButton:hover{background:#ecae27;}"
        )
        self.min_btn.setStyleSheet(
            "QPushButton{border-image:url('./images/min.png');background:#29c941;border-radius:10px;}"
            "QPushButton:hover{background:#1ac033;}"
        )

        # 5.添加工具栏按钮事件
        # 关闭按钮点击绑定窗口关闭事件
        self.close_btn.pressed.connect(self.window.close)
        # 最大化按钮绑定窗口最大化事件
        self.max_btn.pressed.connect(self.setMaxEvent)
        # 最小化按钮绑定窗口最小化事件
        self.min_btn.pressed.connect(self.window.showMinimized)
        # 6.记录全屏窗口的大小-ps非常有用
        self.window_max_size = None
        # 7.设置标题栏鼠标跟踪 鼠标移入触发,不设置,移入标题栏不触发
        self.title.setMouseTracking(True)

    def setMaxEvent(self, flag=False):
        """
        @description  最大化按钮绑定窗口最大化事件和事件 拿出来是因为拖动标题栏时需要恢复界面大小
        @param flag 是否是拖动标题栏 bool
        @return
        """
        if flag:
            if self.window.isMaximized():
                self.window.showNormal()
                self.max_btn.setStyleSheet(
                    "QPushButton{border-image:url('./images/max.png');background:#ffbe2f;border-radius:10px;}"
                    "QPushButton:hover{background:#ecae27;}"
                )
                return self.window_max_size
            return None
        else:
            if self.window.isMaximized():
                self.window.showNormal()
                self.max_btn.setStyleSheet(
                    "QPushButton{border-image:url('./images/max.png');background:#ffbe2f;border-radius:10px;}"
                    "QPushButton:hover{background:#ecae27;}"
                )
            else:
                self.window.showMaximized()
                self.max_btn.setStyleSheet(
                    "QPushButton{border-image:url('./images/restore.png');background:#ffbe2f;border-radius:10px;}"
                    "QPushButton:hover{background:#ecae27;}"
                )
                # 记录最大化窗口的大小  用于返回最大化时拖动窗口恢复前的大小 这个程序循环帧会取不到恢复前的宽度
                self.window_max_size = QSize(self.window.width(), self.window.height())

    def setStyle(self, style: str = ""):
        """
        @description 设置自定义标题栏样式
        @param
        @return
        """
        # 想要边框 加上border:1px solid #cccccc;
        DEFAULT_STYLE = """
                            background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,stop:0 #fafafa,stop:1 #d1d1d1);
                            color:#333333;padding:10px;border:1px solid #c6c6c6;
                            border-top-left-radius:4px;
                            border-top-right-radius:4px;
                        """
        self.title.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)
        # 设置样式
        self.title.setStyleSheet(DEFAULT_STYLE if not style else DEFAULT_STYLE + style)
        # 设置大小
        self.title.setGeometry(0, 0, self.window.width(), self.DEFAULT_TITILE_BAR_HEIGHT)

    def mouseDoubleClickEvent(self, a0: QtGui.QMouseEvent) -> None:
        """
        @description 鼠标双击事件
        @param
        @return
        """
        # 如果双击的是鼠标左键 且在标题栏范围内 则放大缩小窗口
        if a0.button() == Qt.MouseButton.LeftButton and a0.position().y() < self.title.height():
            self.setMaxEvent()
        return self.mouseDoubleClickEvent_parent(a0)

    def resizeEvent(self, a0: QtGui.QResizeEvent) -> None:
        """
        @description  窗口缩放事件
        @param
        @return
        """
        # 最大化最小化的时候,需要去改变按钮组位置
        self.close_btn.move(self.window.width() - 33, 10)
        self.max_btn.move(self.window.width() - 66, 10)
        self.min_btn.move(self.window.width() - 99, 10)
        self.title.resize(self.window.width(), self.DEFAULT_TITILE_BAR_HEIGHT)
        return self.resizeEvent_parent(a0)

使用

class TestWidget(QWidget):
    def __init__(self, parent=None):
        super(TestWidget, self).__init__(parent)
        self.resize(400, 300)
        QCustomTitleBar(self)


if __name__ == '__main__':
    app = QApplication([])
    main = TestWidget()
    main.show()
    app.exec()

隐藏背景

①隐藏背景代码,此时背景上的样式都是无效的

class TestWidget(QWidget):
    def __init__(self, parent=None):
        super(TestWidget, self).__init__(parent)
        # 设置隐藏背景
        self.setAttribute(Qt.WA_TranslucentBackground)


if __name__ == '__main__':
    app = QApplication([])
    main = TestWidget()
    main.show()
    app.exec()

②自定义背景,通过重写paintEvent事件来完成

class TestWidget(QWidget):
    def __init__(self, parent=None):
        super(TestWidget, self).__init__(parent)
        self.resize(400, 300)
        # 设置隐藏背景
        self.setAttribute(Qt.WA_TranslucentBackground)

    # 绘制事件
    def paintEvent(self, event: PySide6.QtGui.QPaintEvent) -> None:
        painter = QPainter(self)
        # 设置无边缘
        painter.setPen(Qt.NoPen)
        # 设置抗锯齿,不然边框会有明显锯齿
        painter.setRenderHint(QPainter.RenderHint.Antialiasing)
        # 设置窗体颜色
        painter.setBrush(QColor(50, 150, 250))
        # 设置绘制区域
        painter.drawRoundedRect(self.rect(), 50, 50)

        super().paintEvent(event)


if __name__ == '__main__':
    app = QApplication([])
    main = TestWidget()
    main.show()
    app.exec()


中间绘制的部分是我们想要的,只需要将标题栏边框隐藏掉就可以了。
 

窗体透明

①窗体透明代码,设置整个窗体的透明度

class TestWidget(QWidget):
    def __init__(self, parent=None):
        super(TestWidget, self).__init__(parent)
        self.setWindowOpacity(0.80)  # 设置窗体透明度


if __name__ == '__main__':
    app = QApplication([])
    main = TestWidget()
    main.show()
    app.exec()

移动和缩放:隐藏标题栏边框后无法移动和缩放。

①移动和缩放代码(​​​​​可以直接Copy) )

# 实现拖动和缩放Widget
class QWindowMoveResizeWidget(QWidget):

    def __init__(self, parent=None):
        super(QWindowMoveResizeWidget, self).__init__(parent)
        # 1.设置无边框 和 透明背景 无边框必须设置全,不然会导致点击任务栏不能最小化窗口
        self.setWindowFlags(
            Qt.Window
            | Qt.FramelessWindowHint
            | Qt.WindowSystemMenuHint
            | Qt.WindowMinimizeButtonHint
            | Qt.WindowMaximizeButtonHint
        )
        # 设置窗体透明度
        self.setWindowOpacity(1)
        # 设置背景透明
        self.setAttribute(Qt.WA_TranslucentBackground)
        # 默认标题栏高度 必须设
        self.DEFAULT_TITILE_BAR_HEIGHT = 40
        # 鼠标缩放窗口最小宽度,必须设
        self.MIN_WINDOW_WIDTH = 10
        self.MIN_WINDOW_HEIGHT = 10
        # 鼠标拖动窗口的标识
        self.m_flag = False
        # 初始化鼠标拖动标题栏标志
        self.drag_flag = False
        # 记录按下时窗口坐标, 这个用于窗口移动
        self.win_x = 0
        self.win_y = 0
        # 记录按下时鼠标坐标,这个用于计算鼠标移动的距离
        self.mouse_x = 0
        self.mouse_y = 0
        # 记录鼠标移入的拖动区域,共8种区域 左上 左 左下 上 下 右上 右 右下
        self.left_up = None
        self.left = None
        self.left_down = None
        self.up = None
        self.down = None
        self.right_up = None
        self.right = None
        self.right_down = None
        # 设置为True则mouseMoveEvent事件不需要按下也能触发,不然要按着鼠标左键或右键才能触发
        self.setMouseTracking(True)
        # 设置子类的mousetrack
        # self.centralwidget.setMouseTracking(True)
        # 记录按下时窗口的大小,用于计算鼠标相对于窗口移动的距离,用于缩放
        self.win_w = 0
        self.win_h = 0
        # 初始化鼠标缩放标志
        self.move_left_up_flag = False
        self.move_left_flag = False
        self.move_left_down_flag = False
        self.move_up_flag = False
        self.move_down_flag = False
        self.move_right_up_flag = False
        self.move_right_flag = False
        self.move_right_down_flag = False

    # 设置边框圆角
    def paintEvent(self, event: PySide6.QtGui.QPaintEvent) -> None:
        painter = QPainter(self)
        painter.setPen(Qt.NoPen)
        painter.setRenderHint(QPainter.RenderHint.Antialiasing)  # 设置抗锯齿,不然边框会有明显锯齿
        painter.setBrush(Qt.white)  # 设置窗体颜色
        painter.drawRoundedRect(self.rect(), 10, 10)
        super().paintEvent(event)

    def resizeEvent(self, a0: QtGui.QResizeEvent) -> None:
        """
        @description  窗口缩放事件
        @param
        @return
        """
        # 最大化最小化的时候,需要去改变按钮组位置
        # self.titleBar.close_btn.move(self.width() - 33, 10)
        # self.titleBar.max_btn.move(self.width() - 66, 10)
        # self.titleBar.min_btn.move(self.width() - 99, 10)
        # self.titleBar.title.resize(self.width(), DEFAULT_TITILE_BAR_HEIGHT)

        # 记录鼠标移入的拖动区域,共8种区域
        self.left_up = QRect(0, 0, 10, 10)
        self.left = QRect(0, 10, 10, self.height() - 20)
        self.left_down = QRect(0, self.height() - 10, 10, 10)
        self.up = QRect(10, 0, self.width() - 20, 10)
        self.down = QRect(10, self.height() - 10, self.width() - 20, 10)
        self.right_up = QRect(self.width() - 10, 0, 10, 10)
        self.right = QRect(self.width() - 10, 10, 10, self.height() - 20)
        self.right_down = QRect(self.width() - 10, self.height() - 10, 10, 10)

        return super().resizeEvent(a0)

    def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None:
        """
        拖动窗口
        """
        if a0.button() == QtCore.Qt.LeftButton and self.isMaximized() == False and self.cursor().shape() == QtGui.QCursor(
                QtCore.Qt.ArrowCursor).shape():
            self.m_flag = True
            self.m_Position = a0.globalPosition().toPoint() - self.pos()  # 获取鼠标相对窗口的位置
            a0.accept()
            self.setCursor(QtGui.QCursor(QtCore.Qt.OpenHandCursor))  # 更改鼠标图标
        else:
            """
            @description 鼠标按下事件
            @param
            @return
            """
            # 记录按下时窗口坐标, 这个用于窗口移动
            self.win_x = self.x()
            self.win_y = self.y()
            # 记录按下时鼠标坐标,这个用于计算鼠标移动的距离
            self.mouse_x = a0.globalPosition().x()
            self.mouse_y = a0.globalPosition().y()
            # 记录按下时窗口的大小,用于计算鼠标相对于窗口移动的距离,用于缩放
            self.win_w = self.width()
            self.win_h = self.height()

            if not self.isMaximized():
                # 如果按下的是鼠标左键
                if a0.button() == Qt.MouseButton.LeftButton and self.left_up.contains(a0.position().x(),
                                                                                      a0.position().y()):
                    self.move_left_up_flag = True
                if a0.button() == Qt.MouseButton.LeftButton and self.left.contains(a0.position().x(),
                                                                                   a0.position().y()):
                    self.move_left_flag = True
                if a0.button() == Qt.MouseButton.LeftButton and self.left_down.contains(
                        a0.position().x(), a0.position().y()
                ):
                    self.move_left_down_flag = True
                if a0.button() == Qt.MouseButton.LeftButton and self.up.contains(a0.position().x(), a0.position().y()):
                    self.move_up_flag = True
                if a0.button() == Qt.MouseButton.LeftButton and self.down.contains(a0.position().x(),
                                                                                   a0.position().y()):
                    self.move_down_flag = True
                if a0.button() == Qt.MouseButton.LeftButton and self.right_up.contains(
                        a0.position().x(), a0.position().y()
                ):
                    self.move_right_up_flag = True
                if a0.button() == Qt.MouseButton.LeftButton and self.right.contains(a0.position().x(),
                                                                                    a0.position().y()):
                    self.move_right_flag = True
                if a0.button() == Qt.MouseButton.LeftButton and self.right_down.contains(
                        a0.position().x(), a0.position().y()
                ):
                    self.move_right_down_flag = True
            return super().mousePressEvent(a0)

    def mouseMoveEvent(self, a0: QtGui.QMouseEvent) -> None:
        """
        拖动窗口
        """
        if QtCore.Qt.LeftButton and self.m_flag and self.cursor().shape() == QtGui.QCursor(
                QtCore.Qt.OpenHandCursor).shape():
            self.move(a0.globalPosition().toPoint() - self.m_Position)  # 更改窗口位置
            a0.accept()
        else:
            """
            @description 鼠标按下移动事件
            @param
            @return
            """
            # 获取移动后鼠标的位置
            mouse_move_x = a0.globalPosition().x()
            mouse_move_y = a0.globalPosition().y()
            # 计算移动的距离
            offset_x = mouse_move_x - self.mouse_x
            offset_y = mouse_move_y - self.mouse_y
            # 移动鼠标时设置鼠标样式
            if not self.isMaximized():
                # 不是拖动的时才可能是缩放状态
                if not self.drag_flag:
                    # 左上
                    if self.left_up.contains(a0.position().x(), a0.position().y()):
                        self.setCursor(Qt.SizeFDiagCursor)
                    # 左
                    elif self.left.contains(a0.position().x(), a0.position().y()):
                        self.setCursor(Qt.SizeHorCursor)
                    # 左下
                    elif self.left_down.contains(a0.position().x(), a0.position().y()):
                        self.setCursor(Qt.SizeBDiagCursor)
                    # 上
                    elif self.up.contains(a0.position().x(), a0.position().y()):
                        self.setCursor(Qt.SizeVerCursor)
                    # 下
                    elif self.down.contains(a0.position().x(), a0.position().y()):
                        self.setCursor(Qt.SizeVerCursor)
                    # 右上
                    elif self.right_up.contains(a0.position().x(), a0.position().y()):
                        self.setCursor(Qt.SizeBDiagCursor)
                    # 右
                    elif self.right.contains(a0.position().x(), a0.position().y()):
                        self.setCursor(Qt.SizeHorCursor)
                    # 右下
                    elif self.right_down.contains(a0.position().x(), a0.position().y()):
                        self.setCursor(Qt.SizeFDiagCursor)
                    else:
                        self.setCursor(Qt.ArrowCursor)
                else:
                    self.setCursor(Qt.ArrowCursor)
            else:
                self.setCursor(Qt.ArrowCursor)
            # 如果按下且在左上角范围内则缩放(其他代码参考左上)
            if self.move_left_up_flag:
                # 拖动的时候也要设置一下形状
                self.setCursor(Qt.SizeFDiagCursor)
                resize_w = self.win_w - offset_x
                resize_h = self.win_h - offset_y
                # 如果缩放后的尺寸小于最小尺寸则窗口不能缩放了
                resize_w = self.MIN_WINDOW_WIDTH if resize_w < self.MIN_WINDOW_WIDTH else resize_w
                resize_h = self.MIN_WINDOW_HEIGHT if resize_h < self.MIN_WINDOW_HEIGHT else resize_h
                # 设置窗口缩放尺寸
                self.resize(resize_w, resize_h)
                # 设置窗口移动,需要鼠标跟随
                # x y 都要鼠标跟随
                if resize_w != self.MIN_WINDOW_WIDTH and resize_h != self.MIN_WINDOW_HEIGHT:
                    self.move(self.win_x + offset_x, self.win_y + offset_y)
                # 缩放宽度等于最小宽度,高度鼠标跟随
                if resize_w == self.MIN_WINDOW_WIDTH and resize_h != self.MIN_WINDOW_HEIGHT:
                    self.move(self.x(), self.win_y + offset_y)
                # 缩放高度等于最小高度,宽度鼠标跟随
                if resize_w != self.MIN_WINDOW_WIDTH and resize_h == self.MIN_WINDOW_HEIGHT:
                    self.move(self.win_x + offset_x, self.y())
            # 如果按下且在左边范围内则缩放
            elif self.move_left_flag:
                # 拖动的时候也要设置一下形状
                self.setCursor(Qt.SizeHorCursor)
                resize_w = self.win_w - offset_x
                resize_h = self.win_h
                # 如果缩放后的尺寸小于最小尺寸则窗口不能缩放了
                resize_w = self.MIN_WINDOW_WIDTH if resize_w < self.MIN_WINDOW_WIDTH else resize_w
                # 设置窗口缩放尺寸
                self.resize(resize_w, resize_h)
                # 设置窗口移动,需要鼠标跟随
                # 只要宽度鼠标跟随
                if resize_w != self.MIN_WINDOW_WIDTH:
                    self.move(self.win_x + offset_x, self.win_y)
            # 如果按下且在左下角范围内则缩放
            elif self.move_left_down_flag:
                # 拖动的时候也要设置一下形状
                self.setCursor(Qt.SizeBDiagCursor)
                resize_w = self.win_w - offset_x
                resize_h = self.win_h + offset_y
                # 如果缩放后的尺寸小于最小尺寸则窗口不能缩放了
                resize_w = self.MIN_WINDOW_WIDTH if resize_w < self.MIN_WINDOW_WIDTH else resize_w
                resize_h = self.MIN_WINDOW_HEIGHT if resize_h < self.MIN_WINDOW_HEIGHT else resize_h
                # 设置窗口缩放尺寸
                self.resize(resize_w, resize_h)
                # 设置窗口移动,需要鼠标跟随
                # x y 都要鼠标跟随
                if resize_w != self.MIN_WINDOW_WIDTH and resize_h != self.MIN_WINDOW_HEIGHT:
                    self.move(self.win_x + offset_x, self.y())
                # 缩放高度等于最小高度,宽度鼠标跟随
                if resize_w != self.MIN_WINDOW_WIDTH and resize_h == self.MIN_WINDOW_HEIGHT:
                    self.move(self.win_x + offset_x, self.y())
            # 如果按下且在上边范围内则缩放
            elif self.move_up_flag:
                # 拖动的时候也要设置一下形状
                self.setCursor(Qt.SizeVerCursor)
                resize_w = self.win_w
                resize_h = self.win_h - offset_y
                # 如果缩放后的尺寸小于最小尺寸则窗口不能缩放了
                resize_h = self.MIN_WINDOW_HEIGHT if resize_h < self.MIN_WINDOW_HEIGHT else resize_h
                # 设置窗口缩放尺寸
                self.resize(resize_w, resize_h)
                # 设置窗口移动,需要鼠标跟随
                # 只要高度鼠标跟随
                if resize_h != self.MIN_WINDOW_HEIGHT:
                    self.move(self.win_x, self.win_y + offset_y)
            # 如果按下且在下边范围内则缩放
            elif self.move_down_flag:
                # 拖动的时候也要设置一下形状
                self.setCursor(Qt.SizeVerCursor)
                resize_w = self.win_w
                resize_h = self.win_h + offset_y
                # 如果缩放后的尺寸小于最小尺寸则窗口不能缩放了
                resize_h = self.MIN_WINDOW_HEIGHT if resize_h < self.MIN_WINDOW_HEIGHT else resize_h
                # 设置窗口缩放尺寸
                self.resize(resize_w, resize_h)
            # 如果按下且在右上角范围内则缩放
            elif self.move_right_up_flag:
                # 拖动的时候也要设置一下形状
                self.setCursor(Qt.SizeBDiagCursor)
                resize_w = self.win_w + offset_x
                resize_h = self.win_h - offset_y
                # 如果缩放后的尺寸小于最小尺寸则窗口不能缩放了
                resize_w = self.MIN_WINDOW_WIDTH if resize_w < self.MIN_WINDOW_WIDTH else resize_w
                resize_h = self.MIN_WINDOW_HEIGHT if resize_h < self.MIN_WINDOW_HEIGHT else resize_h
                # 设置窗口缩放尺寸
                self.resize(resize_w, resize_h)
                # 设置窗口移动,需要鼠标跟随
                # x y 都要鼠标跟随
                if resize_w != self.MIN_WINDOW_WIDTH and resize_h != self.MIN_WINDOW_HEIGHT:
                    self.move(self.win_x, self.win_y + offset_y)
                # 缩放宽度等于最小宽度,高度鼠标跟随
                if resize_w == self.MIN_WINDOW_WIDTH and resize_h != self.MIN_WINDOW_HEIGHT:
                    self.move(self.x(), self.win_y + offset_y)
            # 如果按下且在右边范围内则缩放
            elif self.move_right_flag:
                # 拖动的时候也要设置一下形状
                self.setCursor(Qt.SizeHorCursor)
                resize_w = self.win_w + offset_x
                resize_h = self.win_h
                # 如果缩放后的尺寸小于最小尺寸则窗口不能缩放了
                resize_w = self.MIN_WINDOW_WIDTH if resize_w < self.MIN_WINDOW_WIDTH else resize_w
                # 设置窗口缩放尺寸
                self.resize(resize_w, resize_h)
            # 如果按下且在右下角范围内则缩放
            elif self.move_right_down_flag:
                # 拖动的时候也要设置一下形状
                self.setCursor(Qt.SizeFDiagCursor)
                resize_w = self.win_w + offset_x
                resize_h = self.win_h + offset_y
                # 如果缩放后的尺寸小于最小尺寸则窗口不能缩放了
                resize_w = self.MIN_WINDOW_WIDTH if resize_w < self.MIN_WINDOW_WIDTH else resize_w
                resize_h = self.MIN_WINDOW_HEIGHT if resize_h < self.MIN_WINDOW_HEIGHT else resize_h
                # 设置窗口缩放尺寸
                self.resize(resize_w, resize_h)
            # 如果按下才能移动
            elif self.drag_flag:
                # 设置窗口移动的距离
                self.move(self.win_x + offset_x, self.win_y + offset_y)
            return super().mouseMoveEvent(a0)

    def mouseReleaseEvent(self, a0: QtGui.QMouseEvent) -> None:
        self.m_flag = False
        self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
        """
        @description 鼠标按下松开事件
        @param
        @return
        """
        self.drag_flag = False
        self.move_left_up_flag = False
        self.move_left_flag = False
        self.move_left_down_flag = False
        self.move_up_flag = False
        self.move_down_flag = False
        self.move_right_up_flag = False
        self.move_right_flag = False
        self.move_right_down_flag = False
        self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
        return super().mouseReleaseEvent(a0)

②使用

class TestWidget(QWindowMoveResizeWidget):
    def __init__(self, parent=None):
        super(TestWidget, self).__init__(parent)
        self.resize(400, 300)

    # 绘制事件
    def paintEvent(self, event: PySide6.QtGui.QPaintEvent) -> None:
        painter = QPainter(self)
        # 设置无边缘
        painter.setPen(Qt.NoPen)
        # 设置抗锯齿,不然边框会有明显锯齿
        painter.setRenderHint(QPainter.RenderHint.Antialiasing)
        # 设置窗体颜色
        painter.setBrush(QColor(50, 150, 250))
        # 设置绘制区域
        painter.drawRoundedRect(self.rect(), 50, 50)

        super().paintEvent(event)


if __name__ == '__main__':
    app = QApplication([])
    main = TestWidget()
    main.show()
    app.exec()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五、卷积神经网络CNN5(图像卷积与反卷积)

图像卷积 首先给出一个输入输出结果那他是怎样计算的呢&#xff1f; 卷积的时候需要对卷积核进行 180 的旋转&#xff0c;同时卷积核中心与需计算的图像像素对齐&#xff0c;输出结构为中心对齐像素的一个新的像素值&#xff0c;计算例子如下&#xff1a;这样计算出左上角(即第…

【畅购商城】内网穿透之EchoSite

目录 概述 注册用户 抢注域名 ​​​​​​​下载客户端 ​​​​​​​编写配置文件 ​​​​​​​启动 ​​​​​​​访问 ​​​​​​​概述 EchoSite一款收费的内网映射工具&#xff08;已下架&#xff09; 花生壳&#xff1a;内网穿透工具&#xff0c;免费版…

springboot集成Lombok、MybaitsPlus、SwaggerUI

springboot集成Lombok、MybaitsPlus、SwaggerUI 基础环境&#xff1a;JDK8或者JDK11版本 Maven3.5(采⽤默认) IDEA旗舰版 Mysql5.7以上版本 创建springboot项目 在线构建⼯具 https://start.spring.io/ 修改pom.xml中内容 <!-- 代码库 --> <repositories> &l…

如何提高量化策略回测的效率

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

教你轻松设计圣诞节日活动的邀请函?

即将迎来一年一度的圣诞活动&#xff0c;商家们要如何对此次活动展开宣传呢&#xff1f;要如何制作出一张符合节日气氛的活动邀请函&#xff1f;下面小编就教你如何使用在线工具乔拓云&#xff0c;用在线邀请函模板设计活动邀请函&#xff0c;一键就能生成活动邀请函链接&#…

springmvc整体运行流程

请求处理的流程 1&#xff1a;浏览器发送请求送至前端控制器DispatcherServlet。 2&#xff1a;DispatcherServlet收到请求后调用HandlerMapping处理器映射器。 3&#xff1a;处理器映射器找到具体的Handler处理器&#xff0c;封装成为执行链 4&#xff1a;返回执行链给Disp…

SpringBoot+MyBatis多表查询:以点餐系统的订单管理为例

文章目录项目场景数据库设计POJODaoServiceTest运行结果问题及解决项目场景 SpringBoot MyBatis &#xff0c;实现点餐系统的订单查询。 参考&#xff1a;SpringBootMyBatis多表联合查询 数据库设计 通常一个订单中会包含多个菜品&#xff0c;即一条 order 里含多个 item&am…

使用 Zotero Citation Counts Manager 自动获取文献引用数

前言 最近习惯了搜完文献把文献的引用贴进 Zotero 文献条目的 Note 里&#xff0c;但是自己一点一点打字太累。想到了 Zotero 有插件&#xff0c;简单调研一下&#xff0c;发现了一个可以用的插件。支持 CrossRef 和 SemanticScholar 的引用数获取。&#xff08;相对来说个人比…

QT QSlider、QHorizontalSlider、QVerticalSlider 控件 使用详解

本文详细的介绍了QSlider、QHorizontalSlider、QVerticalSlider控件的各种操作&#xff0c;例如&#xff1a;新建界面、设置刻度显示、设置范围值、设置值、获取值、设置步长、刻度间隔、改变方向、滑动信号、按下信号、滑动信号、释放滑块、样式表等操作。 本系列QT全面详解文…

职业生涯交叉点,7年测试工程师经历,继续做测试还是转开发?

我毕业后一直从事软件测试工作&#xff0c;今年28岁了。所做的工作都是功能测试&#xff0c;对于性能测试、自动化测试完全没有接触。 我是在深圳的一个小公司上班&#xff0c;每天朝九晚五的&#xff0c;工作不累。属于那种要来活了半天就可以搞定&#xff0c;剩下的时间都是…

三车道交通流元胞自动机研究附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

app提交上架最新流程 ios​

一、上架基本需求资料 1、苹果开发者账号&#xff08;公司已有可以不用申请&#xff0c;需要开通开发者功能&#xff0c;每年 99 美元&#xff09;​ 2、开发好的APP​ 二、证书 上架版本需要使用正式的证书​ 1、创建证书 ​​Apple Developer​​​ 2、上传证书 Sign In …

设计模式之工厂方法模式

factory method design pattern 工厂方法模式的概念、工厂方法模式的结构、工厂方法模式的优缺点、工厂方法模式的使用场景、工厂方法模式的实现示例、工厂方法模式的源码分析 1、工厂方法的概念 工厂方法模式&#xff0c;及简单工厂模式的升级版&#xff0c;其抽象了对象的创…

进阶 - Git分支管理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zGglo72S-1670494545297)(https://lili40342.gitee.io/my-images/page/p_git.png)] 本篇文章&#xff0c;是基于我自用Linux系统中的自定义文件夹“test_rep”&#xff0c;当做示例演示 具体Git仓库的目…

用无代码,「低」人力成本也能做出「高」质量售后服务

目录 智能派单提升响应速度,移动端处理高效便捷 主动提升客户满意度,统一管理客户信息 标准化领、退料流程,精细化控制物料成本 沉淀数据资产,实时掌握最新状况 双十一大促热潮刚过,部分商家就开始因为“重销售,轻售后”的经营策略,而面临消费者的维权投诉,导致庆功…

企业微信对外收款功能如何开通?

之前很多企业在微信上运营客户&#xff0c;与客户达成交易后在微信上完成收款&#xff0c;但是会存在员工谎报账款、走私单的情况&#xff0c;因此企业改用企业微信对公收款。 前言 之前很多企业都在微信上运营客户&#xff0c;从开始追踪客户到成交客户这一整个过程都在微信上…

Day41——Dp专题

文章目录四、完全背包01背包的核心代码完全背包的核心代码12、零钱兑换 II13、组合总和 Ⅳ四、完全背包 完全背包&#xff1a;每一个物品可以选无限次 完全背包和01背包问题唯一不同的地方就是&#xff0c;每种物品有无限件 01背包的核心代码 for(int i 0; i < weight.…

全网最全的linux上docker安装oracle的详细文档,遇到了n个问题,查了几十篇文章,最终汇总版,再有解决不了的,私聊我,我帮你解决

文章目录全网最全的linux上docker安装oracle的详细文档&#xff0c;遇到了n个问题&#xff0c;查了几十篇文章&#xff0c;最终汇总版&#xff0c;再有解决不了的,私聊我&#xff0c;我帮你解决1. 拉取阿里镜像oracle2. 创建初始化数据3. 创建启动容器 数据持久化4. 进入oracle…

JVM学习初整理

JVM 内存结构(运行时数据区)&#xff1a;堆(Heap)&#xff0c;方法区(Method area)&#xff0c;栈(本地方法栈(Native Method Stacks)&#xff0c;虚拟机方法栈(Java Virtual Machine Stacks))&#xff0c;程序计数器(The pc Register) 堆&#xff1a;java虚拟机所管理的内存…

空调集中控制器的分类

在日常生活中&#xff0c;人们接触较多的是空调遥控器&#xff0c;空调智能控制器与空调遥控器有较大区别。空调遥控器是一对一管理&#xff0c;空调控制器可以集中管理。一般应用于机房管理、学校教室、图书馆管理、办公室、大型商场、工厂宿舍等地方。 红外空调控制器 红外空…