QScrollArea 利用滚动条位置动态绘制内容 优化内存写法 C++ 提供完整例子
2条回答 默认 最新
- lshen01 2023-03-20 14:32关注
参考GPT和自己的思路:
对于这个问题,我可以给出一个大体思路:
- 创建一个 QWidget,命名为 MyWidget,用来绘制内容。
- 将 MyWidget 放入 QScrollArea 中。
- 通过监听 QScrollArea 的滚动事件,获取当前的滚动条位置。
- 根据当前滚动条位置,计算需要绘制的内容的起始和结束 index。
- 在 MyWidget 中绘制从起始 index 到结束 index 之间的内容。
- 确保绘制过程中不会占用过多内存,可以使用一些优化技巧,比如只绘制可见区域内的内容。
下面是一个简化的示例代码,供参考:
#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 数据,如何处理滚动条的值域和步长等,需要根据实际情况进行调整和优化。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥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进行服务器的数据共享