QT создает огромную сетку с интерактивными элементами - PullRequest
0 голосов
/ 04 августа 2020

Я хочу сделать огромную сетку кнопок (500-1000 ячеек) размером 16x16, и я не уверен, как лучше всего это сделать. Я пытался сделать это с помощью QTableView, но код ниже не сделал ячейки достаточно маленькими (он работает с большими размерами)

QHeaderView * vertHeader = ui->view->verticalHeader();
vertHeader->setSectionResizeMode(QHeaderView::Fixed);
vertHeader->setDefaultSectionSize(16);
vertHeader->setVisible(false);
QHeaderView * horHeader = ui->view->horizontalHeader();
horHeader->setSectionResizeMode(QHeaderView::Fixed);
horHeader->setDefaultSectionSize(16);
horHeader->setVisible(false);

А вот как выглядят ячейки по сравнению с прямоугольником 30x30:

размер пустых ячеек по сравнению с серым прямоугольником 30x30

Можно ли сделать ячейки меньше? И / или лучше просто использовать QGraphicsScene для этой задачи?

Я тоже думал об использовании QGridLayout, но не будет ли производительность с ним ужасной?

1 Ответ

0 голосов
/ 04 августа 2020

Это действительно зависит от того, что вы хотите делать с этими кнопками. Но с таким количеством отображаемых элементов создание компонентов может занять несколько секунд, если вы используете настоящую кнопку (например, QPushButton) для каждой ячейки и хотите отображать их все сразу.

a) Чтобы имеют лучшую производительность, можно просто создать подкласс QWidget и переопределить void paintEvent(..), чтобы нарисовать все ячейки точно так, как вы хотите, с помощью QPainter и использовать void mousePressEvent(..) для обнаружения щелчков, а затем самостоятельно выполнить математические вычисления, чтобы сопоставить координаты щелчка в камеру. Помещение этого виджета в QScrollArea позволит прокручивать его, если он слишком велик для отображения.

b) Фреймворк QGraphicsView также хорош для отображения тысяч элементов. Реализация была бы более мощной, чем а), но и немного более сложной. Было бы разумно, если вы планируете развивать это представление в будущем, иметь другие элементы для отображения и т. Д. c.

c) Для решения QTableView вы можете попробовать использовать делегат чтобы иметь немного больше контроля над отображением ячеек.

...