我是Qt的新手,我正试图通过“活细胞”的反击来实现康威的生命游戏 - 当它被着色时,细胞还活着。
我想知道如何计算QTableWidget
中有色单元格的数量。
我的意思是我不能使用“if loop”,因为编译器无法将QTableWidgetItem::backroundColor
转换为bool
变量。我该怎么办?
答案 0 :(得分:2)
编译器无法将QTableWidgetItem :: backroundColor转换为bool变量。
首先,没有这样的成员。
此外,你没有显示backgroundColor的具体数据类型,所以我认为它是QColor而不是QString,等等。
在这种情况下,例如这两种QColor
方法可以帮助你完成工作:
QColor::QColor(Qt::GlobalColor color)
这是一个重载功能。
构造一种颜色为颜色的新颜色。
以及以下运营商:
bool QColor::operator==(const QColor & color) const
如果此颜色具有与颜色相同的RGB和alpha值,则返回true;否则返回false。
所以,你可以这样写:
const QColor redColor = QColor(Qt::red); // constant, initialized once
然后你会像这样比较:
QBrush tableWidgetItemBrush = tableWidgetItem->background();
if (tableWidgetItemBrush.color() == redColor)
++livingCells;
在提供了您想要的代码之后,我建议将来重新考虑这个设计。
我会在UI中使用不同的“核心”表示,以便正确解耦,甚至可以直接存储在数据库中,或者在基于命令行的泥游戏中重复使用,等等。
另外,如果另一天,你决定不根据颜色,但不同的模式做出差异呢?
答案 1 :(得分:0)
我个人不会为此目的使用QTableWidget
,即使它可以做到这一点,但这是一个巨大的开销。特别是考虑到“单元”可以有效地由位图的单个像素表示。您可以使用位图像素图作为“画布”,然后绘制它而无需平滑以使像素“更大”。最重要的是,您可以直接将位图用作bool值,它甚至比使用bool
成员更有效,因为它只使用一个位来表示单元格是死还是活,这也是表格的图形表示。一石二鸟。更不用说这种表示方式对缓存友好程度的影响要大于内存中散布的一堆沉重且基于QWidget
的重物。
此外,通过整个桌子来获得活细胞计数听起来像是完全浪费。通过跟踪更改,您最好跟踪计数。如果需要,您可以更改计数变量,甚至可以使用活细胞保留注册表。