QScrollArea 利用滚动条位置动态绘制内容 优化内存写法 C++ 提供完整例子
参考GPT和自己的思路:
对于这个问题,我可以给出一个大体思路:
下面是一个简化的示例代码,供参考:
#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 数据,如何处理滚动条的值域和步长等,需要根据实际情况进行调整和优化。