关于如何使用Qt模型视图类的建议

Advice on how to use Qt Model View classes

本文关键字:视图 模型 于如何 Qt      更新时间:2023-10-16

所以我一直在用c++写一个数独游戏。我已经完成并测试了大部分游戏逻辑,但我想在GUI上使用Qt。我试图找出最好的方法来工作与Qt类为我的需要。

作为测试,我使用了QAbstractTableModel。我对它进行了子类化,并让它访问我现有的数据模型和控制器。现在我使用QTableView来获得基本的渲染数独板和基本的"编辑"(你可以改变任何值)。它看起来一点也不像我想要的,但功能都在那里(或者可以添加)。

我想做一个数据模型和控制器来修改它全部在c++中,不依赖于框架。然后我想让Qt坐在上面。所以我让它工作了,这里是一个快速的"图表",说明这些东西是如何在高层次上交流的

QTableView?
    ^
    |
    v
PuzzleModel : QAbstractTableModel
             ^              |
             |              |_____________
             |                            v
Real data model classes <------------ Controllers

我的问题是,我如何修改QTableView或我应该创建自己的视图或QWidget,以显示我想要的方式的数据?

理想情况下,我想显示一个固定大小的表(没有标题,没有调整大小),不允许多选择。有一些关于我如何渲染各种字体样式/颜色的自定义,但我认为我可以很容易地处理。我还想将每个单元格渲染为数字,或者像这样为"标记":

*-------------*         *-------------*
|  1   2   3  |         |   ******    |
|  4       6  |         |        *    |
|      8   9  |         |        *    |
*-------------*         *-------------*

显然我不能继续使用QTableView。我创建我自己的QStyledItemDelegate和仍然使用QTableView吗?我需要创建一个完整的小部件吗?如果我创建

只是从知道各种Qt类功能的人那里寻找一些建议/方向。

您有两个选择:

  1. 继续使用QTableView和你的QAbstractTableModel,以及子类QStyledItemDelegate来渲染细胞你想要的。但是你不能这样改变细胞间的绘制。

    注意,然而,你可以实现很多你想要的(字体,颜色)通过反应更多的Qt::ItemDataRole s从你的模型的data()实现。

  2. 编写自定义小部件并使用自定义数据提供程序接口。让我强调一下:当你实现自己的SudokuWidget时,不要继续使用QAbstractTableModel。这种方式对每个人来说都要简单得多(QAbstractItemModel对于项目视图来说既过于抽象又过于专门化,无法作为通用的数据提供程序接口)。

我的建议是选(2).面试被高估了。