头发继续乱 2023-03-20 14:22 采纳率: 47.4%
浏览 18
已结题

QScrollArea 利用滚动条位置动态绘制内容 优化内存写法 C++ 提供完整例子

QScrollArea 利用滚动条位置动态绘制内容 优化内存写法 C++ 提供完整例子

  • 写回答

2条回答 默认 最新

  • lshen01 2023-03-20 14:32
    关注

    参考GPT和自己的思路:

    对于这个问题,我可以给出一个大体思路:

    1. 创建一个 QWidget,命名为 MyWidget,用来绘制内容。
    2. 将 MyWidget 放入 QScrollArea 中。
    3. 通过监听 QScrollArea 的滚动事件,获取当前的滚动条位置。
    4. 根据当前滚动条位置,计算需要绘制的内容的起始和结束 index。
    5. 在 MyWidget 中绘制从起始 index 到结束 index 之间的内容。
    6. 确保绘制过程中不会占用过多内存,可以使用一些优化技巧,比如只绘制可见区域内的内容。

    下面是一个简化的示例代码,供参考:

    #include <QtWidgets>
    
    class MyWidget : public QWidget {
      Q_OBJECT
     public:
      explicit MyWidget(QWidget* parent = nullptr) : QWidget(parent) {}
    
     protected:
      void paintEvent(QPaintEvent* event) override {
        QPainter painter(this);
        QRect rect = event->rect();
    
        // 根据当前的滚动条位置计算需要绘制的内容的起始和结束 index
        int startIndex = std::max(0, (int)(rect.y() / itemHeight));
        int endIndex =
            std::min(itemCount - 1, (int)((rect.y() + rect.height()) / itemHeight));
    
        // 绘制从起始 index 到结束 index 之间的内容
        for (int i = startIndex; i <= endIndex; i++) {
          // 在 painter 中绘制第 i 个 item
        }
      }
    
     private:
      int itemCount;  // item 的总数
      int itemHeight;  // 每个 item 的高度
    };
    
    class MainWindow : public QMainWindow {
     public:
      explicit MainWindow(QWidget* parent = nullptr) : QMainWindow(parent) {
        setCentralWidget(&scrollArea);
    
        // 设置滚动条范围
        scrollArea.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
        scrollArea.setMinimumSize(200, 200);
        scrollArea.setMaximumSize(400, 400);
        scrollArea.setWidgetResizable(true);
    
        // 创建 MyWidget
        myWidget = new MyWidget(&scrollArea);
        myWidget->resize(1000, 1000);
    
        // 将 MyWidget 放入 QScrollArea 中
        scrollArea.setWidget(myWidget);
    
        // 连接 QScrollArea 的滚动事件
        connect(scrollArea.verticalScrollBar(), &QScrollBar::valueChanged, this,
                &MainWindow::onScroll);
      }
    
     private slots:
      void onScroll(int value) { myWidget->update(); }
    
     private:
      QScrollArea scrollArea;
      MyWidget* myWidget;
    };
    
    int main(int argc, char* argv[]) {
      QApplication app(argc, argv);
    
      MainWindow mainWindow;
      mainWindow.show();
    
      return app.exec();
    }
    

    需要注意的是,这只是一个简化的示例代码,实际实现中还有很多需要考虑的细节,比如如何管理和更新 item 数据,如何处理滚动条的值域和步长等,需要根据实际情况进行调整和优化。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月25日
  • 已采纳回答 1月17日
  • 创建了问题 3月20日

悬赏问题

  • ¥15 访问url时不会自动调用其 Servlet的doGet()
  • ¥15 用白鹭引擎开发棋牌游戏的前端为什么这么难找
  • ¥15 MATLAB解决问题
  • ¥35 哪位专业人士知道这是什么原件吗?哪里可以买到?
  • ¥15 关于#c##的问题:treenode反序列化后获取不到上一节点和下一节点,Fullpath和Handle报错
  • ¥15 一部手机能否同时用不同的app进入不同的直播间?
  • ¥15 没输出运行不了什么问题
  • ¥20 输入import torch显示Intel MKL FATAL ERROR,系统驱动1%,: Cannot load mkl_intel_thread.dll.
  • ¥15 点云密度大则包围盒小
  • ¥15 nginx使用nfs进行服务器的数据共享