QT开发中文网

画布支持鼠标移动和滚动条同步

要实现画布支持鼠标移动和滚动条同步,你需要处理鼠标事件,并在鼠标移动时更新视图的滚动位置。下面是一个示例,展示了如何通过重载事件处理器来实现这一点:

#include <QApplication>
#include <QWidget>
#include <QHBoxLayout>
#include <QFrame>
#include <QScrollArea>
#include <QMouseEvent>

class CanvasFrame : public QFrame {
public:
    CanvasFrame(QWidget *parent = nullptr) : QFrame(parent) {
        setFixedSize(50000, 1500); // 巨型画布大小
        setStyleSheet("background-color: black;");
    }

protected:
    void mouseMoveEvent(QMouseEvent *event) override {
        if (event->buttons() & Qt::LeftButton) {
            // 根据鼠标移动更新视图位置
            int deltaX = event->pos().x() - lastMousePosition.x();
            int deltaY = event->pos().y() - lastMousePosition.y();

            // 更新滚动区域的位置
            QScrollArea* scrollArea = qobject_cast<QScrollArea*>(parent());
            if (scrollArea) {
                QPoint pos = scrollArea->horizontalScrollBar()->sliderPosition();
                scrollArea->horizontalScrollBar()->setSliderPosition(pos - deltaX);
                pos = scrollArea->verticalScrollBar()->sliderPosition();
                scrollArea->verticalScrollBar()->setSliderPosition(pos - deltaY);
            }
        }
        lastMousePosition = event->pos();
        QFrame::mouseMoveEvent(event);
    }

    void mousePressEvent(QMouseEvent *event) override {
        if (event->button() == Qt::LeftButton) {
            lastMousePosition = event->pos(); // 记录初始位置
        }
        QFrame::mousePressEvent(event);
    }

private:
    QPoint lastMousePosition; // 上一次鼠标位置
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建主窗口
    QWidget mainWindow;
    mainWindow.setWindowTitle("显示窗口");
    
    // 设置主窗口最大化
    mainWindow.showMaximized();

    // 创建水平布局
    QHBoxLayout *layout = new QHBoxLayout(&mainWindow);
    layout->setContentsMargins(0, 0, 0, 0); // 设置布局边距为零
    layout->setSpacing(0); // 设置间距为零

    // 创建左边子窗口
    QFrame *leftFrame = new QFrame();
    leftFrame->setFixedWidth(200); // 左侧固定宽度
    leftFrame->setStyleSheet("background-color: green;");

   // 创建右边的巨型画布(作为框架)
   CanvasFrame *canvasFrame = new CanvasFrame();

   // 将画布放入滚动区域中
   QScrollArea *scrollArea = new QScrollArea();
   scrollArea->setWidget(canvasFrame);
   scrollArea->setWidgetResizable(true);  // 自适应尺寸 
   scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); 
   scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);

   // 将子窗口添加到布局中
   layout->addWidget(leftFrame);
   layout->addWidget(scrollArea);

   // 显示主窗口
   mainWindow.show(); 

   return app.exec();
}

更新说明:

  1. CanvasFrame 类:定义一个新的类 CanvasFrame,继承自 QFrame。重写 mouseMoveEventmousePressEvent 方法。
  2. 鼠标移动:当用户按下左键并拖动鼠标时,通过计算移动的距离来调整滚动条的位置,以便在移动画布时同步更新视图。
  3. 记录上一个鼠标位置:通过记录上一个鼠标点击的位置,计算当前与上一个位置的偏移量。

这样就可以实现在画布上的拖拽操作,同时使得滚动条的滑动与之同步。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=13069

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?