六、Qt之鼠标拖动界面移动代码实现

主要适用于组件无法点击时的处理

//继承事件过滤器
bool GifWidget::eventFilter(QObject *watched, QEvent *event)
{
    static QPoint mousePoint;
    static bool mousePressed = false;

    QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
    if (mouseEvent->type() == QEvent::MouseButtonPress) {
        if (mouseEvent->button() == Qt::LeftButton) {
            mousePressed = true;
            mousePoint = mouseEvent->globalPos() - this->pos();
            return true;
        }
    } else if (mouseEvent->type() == QEvent::MouseButtonRelease) {
        mousePressed = false;
        return true;
    } else if (mouseEvent->type() == QEvent::MouseMove) {
        if (mousePressed && (mouseEvent->buttons() && Qt::LeftButton)) {
            this->move(mouseEvent->globalPos() - mousePoint);
            return true;
        }
    }

    return QWidget::eventFilter(watched, event);
}

//安装事件过滤器
this->installEventFilter(this);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个可以实现你要求的 PySide2 widget 界面效果的示例代码: ```python from PySide2.QtWidgets import * from PySide2.QtCore import * from PySide2.QtGui import * class MainWindow(QWidget): def __init__(self): super().__init__() # 设置窗口无边框 self.setWindowFlags(Qt.FramelessWindowHint) # 添加放大、缩小、关闭按钮 self.btn_maximize = QPushButton('口') self.btn_minimize = QPushButton('一') self.btn_close = QPushButton('X') # 设置按钮的样式及大小 self.btn_maximize.setObjectName('maximize') self.btn_minimize.setObjectName('minimize') self.btn_close.setObjectName('close') self.btn_maximize.setFixedSize(20, 20) self.btn_minimize.setFixedSize(20, 20) self.btn_close.setFixedSize(20, 20) # 添加按钮的响应事件 self.btn_maximize.clicked.connect(self.maximize) self.btn_minimize.clicked.connect(self.minimize) self.btn_close.clicked.connect(self.close) # 创建标题栏 self.title_bar = QWidget() self.title_bar.setObjectName('title_bar') # 添加标题栏的布局 self.layout_title = QHBoxLayout(self.title_bar) self.layout_title.setContentsMargins(0, 0, 0, 0) self.layout_title.setSpacing(0) self.layout_title.addWidget(QLabel('Title', self.title_bar)) self.layout_title.addWidget(self.btn_minimize) self.layout_title.addWidget(self.btn_maximize) self.layout_title.addWidget(self.btn_close) # 添加主窗口的布局 self.layout_main = QVBoxLayout(self) self.layout_main.setContentsMargins(0, 0, 0, 0) self.layout_main.addWidget(self.title_bar) # 设置窗口背景色 self.setStyleSheet(''' QWidget { background-color: white; } #title_bar { background-color: #303030; color: white; height: 30px; } QPushButton#maximize, QPushButton#minimize, QPushButton#close { border: none; color: white; font-size: 16px; } QPushButton#maximize:hover, QPushButton#minimize:hover, QPushButton#close:hover { background-color: #555; } ''') # 设置窗口大小 self.setFixedSize(600, 400) def maximize(self): if self.isMaximized(): self.showNormal() else: self.showMaximized() def minimize(self): self.showMinimized() # 实现鼠标拖动窗口 def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.m_flag = True self.m_Position = event.globalPos() - self.pos() event.accept() self.setCursor(QCursor(Qt.OpenHandCursor)) def mouseMoveEvent(self, QMouseEvent): if Qt.LeftButton and self.m_flag: self.move(QMouseEvent.globalPos() - self.m_Position) QMouseEvent.accept() def mouseReleaseEvent(self, QMouseEvent): self.m_flag = False self.setCursor(QCursor(Qt.ArrowCursor)) if __name__ == '__main__': app = QApplication([]) win = MainWindow() win.show() app.exec_() ``` 这段代码首先创建了一个 `MainWindow` 类,并在 `__init__` 方法中设置了窗口无边框,添加了最大化、最小化和关闭按钮,并设置了按钮的样式及其响应事件。在 `mousePressEvent`、`mouseMoveEvent` 和 `mouseReleaseEvent` 方法中实现鼠标拖动窗口的功能。最后通过 `app.exec_()` 运行程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值