【问题标题】:QT creating huge grid with clickable itemsQT 创建带有可点击项目的巨大网格
【发布时间】:2020-08-04 11:16:35
【问题描述】:

我想制作一个大小为 16x16 的巨大按钮网格(500-1000 个单元格),但我不确定最好的方法是什么。 我尝试用 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 矩形相比的外观:

是否可以使单元格更小?和/或仅使用 QGraphicsScene 来完成该任务会更好吗?

我也考虑过使用QGridLayout,但是使用它的性能不会很糟糕吗?

【问题讨论】:

  • 你想要“按钮”吗?像一个大的可点击场景,你只需要检测坐标并确定它们属于哪个“虚拟按钮”这样的东西也适合你吗?
  • @DanM。我认为它对我有用,但实施它有多难?特别是如果我希望按钮在鼠标按钮指向它并按下时看起来被按下
  • 我会说先尝试幼稚的方法(QGridLayout)看看。
  • @crends Alexandre 已经指出了解决方案。我将补充一点,我在 QML 中做了类似的事情,而且这很简单。不确定基于纯 QWidget 的实现,但我认为这并不难,只是更多样板。特别是如果您不尝试模仿原生按钮的外观。

标签: c++ qt qtableview qgraphicsscene


【解决方案1】:

这真的取决于你想用这些按钮做什么。但是由于要显示的项目太多,如果您为每个单元格使用真正的按钮(例如 QPushButton)并且想要一次显示它们,则可能需要几秒钟来创建组件。

a) 为了获得更好的性能,一个选项是简单地继承 QWidget 并重新实现 void paintEvent(..) 以使用 QPainter 完全按照您想要的方式绘制所有单元格,并使用 void mousePressEvent(..) 来检测点击,然后自己进行数学运算将点击的坐标映射到一个单元格。将此小部件放入 QScrollArea 将允许在它太大而无法显示时滚动。

b) QGraphicsView 框架也可以很好地显示数千个项目。该实现将比 a) 更强大,但也更复杂一些。如果您计划在未来进一步开发此视图、显示其他项目等,这将是有意义的。

c) 对于 QTableView 解决方案,您可以尝试使用委托来更好地控制单元格的显示方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多