【PyQt5】无边窗在指定范围内拖动生效

基于Python socket利用TCP协议让上下位机 传输图片

Notes

网上几乎翻不到多少 关于 PyQt5 无边框窗口后 在指定控件范围内拖动生效的解释。这里我讲一个方式,可以一次性解决Combobox冲突宕机、输入拉条冲突死机 以及 核心问题:想要自定义一个如原有的win有边窗外窗口那样指定窗体区域内的拖动。


1. 原理

直接说结论,这里用到一个窗体控件方法:self.控件名.underMouse()。
那么这有什么含义?就字面理解即可,返回一个bool值,表示你鼠标是否点击了该控件。既然有了这个,那么我们直接将这个判断条件加入到 全局鼠标事件监听方法mousePressEvent里 就能完美实现 自定义置顶可拖动窗体了。



2. 代码实现:



class main(QMainWindow, Ui_MainWindow):
    def __init__(self):
        # 初始化
        super().__init__()
        self.setupUi(self)

        # 无边窗化
        self.setWindowFlags(QtCore.Qt.WindowType.FramelessWindowHint)
        self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
        
        # 窗口可拖动变量初始化
        self.move_Flag = False
        self.mouse_x = self.mouse_y = self.origin_x = self.origin_y = None


    def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None:
        """鼠标点击状态"""
        # 当点击时候,先重新初始化拖动标识位为否
        self.move_Flag = False
        # 核心部分: 当鼠标点击是左键 并且 在top控件内点击时候触发 (这里的top控件即为 我自定义的顶部窗体)
        if a0.button() == Qt.LeftButton and self.top.underMouse():
            self.setCursor(Qt.OpenHandCursor)
            # 但判断条件满足时候, 把拖动标识位设定为真
            self.move_Flag = True
            self.mouse_x = a0.globalX()
            self.mouse_y = a0.globalY()

            # 获取窗体当前坐标
            self.origin_x = self.x()
            self.origin_y = self.y()

    def mouseMoveEvent(self, a0: QtGui.QMouseEvent) -> None:
        """鼠标移动状态"""
        # 拖动标识位设定为真时, 进入移动事件
        if self.move_Flag:
            # 计算鼠标移动的x,y位移
            move_x = a0.globalX() - self.mouse_x
            move_y = a0.globalY() - self.mouse_y

            # 计算窗体更新后的坐标:更新后的坐标 = 原本的坐标 + 鼠标的位移
            dest_x = self.origin_x + move_x
            dest_y = self.origin_y + move_y

            # 移动窗体
            self.move(dest_x, dest_y)

    def mouseReleaseEvent(self, a0: QtGui.QMouseEvent) -> None:
        """鼠标释放状态"""
        # 设定鼠标为普通状态: 箭头
        self.setCursor(Qt.ArrowCursor)


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在PyQt5窗口中嵌入指定的PPT文件,您可以使用QAxWidget模块和PyWin32库。首先,您需要确保已安装Microsoft Office软件并安装了PowerPoint应用程序。然后,您可以使用以下代码将指定的PPT文档嵌入到PyQt5窗口中: ```python from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * import sys import win32com.client class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) # 创建QAxWidget对象 self.axWidget = QAxWidget(self) self.axWidget.setFocusPolicy(Qt.StrongFocus) # 设置PowerPoint的CLSID self.axWidget.setControl("{91493441-5A91-11CF-8700-00AA0060263B}") # 加载PPT文档 self.axWidget.setProperty("DisplayAlerts", False) self.axWidget.setProperty("DisplayDocumentInformationPanel", False) self.axWidget.setProperty("DisplayStatusbar", False) self.axWidget.setProperty("DisplayScrollBars", False) self.axWidget.setProperty("DisplayRightToLeft", False) self.axWidget.setFixedSize(800, 600) self.axWidget.move(0, 0) # 打开指定的PPT文档 ppt = win32com.client.Dispatch("PowerPoint.Application") ppt.Visible = True presentation = ppt.Presentations.Open(r"C:\path\to\your\file.pptx") presentation.SlideShowSettings.Run() # 将PPT文档嵌入到PyQt5窗口中 hwnd = int(presentation.SlideShowWindow.HWND) self.axWidget.setProperty("Handle", hwnd) self.axWidget.show() # 设置窗口大小和标题 self.setGeometry(100, 100, 800, 600) self.setWindowTitle("Embedded PowerPoint Document") app = QApplication(sys.argv) mainWindow = MainWindow() mainWindow.show() sys.exit(app.exec_()) ``` 在这个例子中,我们创建了一个QAxWidget对象,并将PowerPoint的CLSID设置为"{91493441-5A91-11CF-8700-00AA0060263B}"。然后,我们使用PyWin32库打开了指定的PPT文档,并将其作为演示文稿运行。最后,我们将PPT文档嵌入到PyQt5窗口中,并设置了窗口的大小和标题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Panzer_Jack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值