在构造函数中迭代QTableWidget单元格?

时间:2016-08-15 12:47:53

标签: c++ qt constructor qt-designer qtablewidget

我想从它的构造函数中设置一个QTableWidget的子类只读,但我找不到将标志放在所有项上的方法,并且由于在构造函数中调用了columnCount和rowCount,所以显示的代码不起作用,因此返回0。

for (int i=0;i<this->columnCount();i++) {
    for (int j=0;j<this->rowCount();j++) {
        this->item(i,j)->setFlags(Qt::ItemFlag::NoItemFlags);
    }
}

由于标题是通过Qt Designer使用双击形式初始化的,我没有办法从代码中知道列/行数(除了通过硬编码,但我想避免这种情况),我找不到任何方法将标志应用于所有项目。

我也看过一些workarounds working on the modification event itself to prevent data modification,但我也希望避免这样做。

有没有办法正确设置这些标志,还是我必须摆脱Qt Designer部分才能在构造函数中添加所有标头初始化?

2 个答案:

答案 0 :(得分:4)

嘿,这解决了你的问题...

for (int i=0;i< ui->tableWidget->rowCount();i++) {
        for (int j=0;j< ui->tableWidget->columnCount();j++) {
            QTableWidgetItem *item =  ui->tableWidget->item(i,j);
            item->setFlags(Qt::NoItemFlags);
        }
    }

试试这个,您可以轻松找出代码的问题...... rowCount()和coloumnCount()api应该正确对齐它的item()API,而不是itemAT()..请检查。

答案 1 :(得分:0)

由于您的QTableView正在自动生成的setupUi()中填充(创建了第一个小部件,然后添加了项目),您可以向您的子类添加setReadOnly(bool)之类的方法(我想这个小部件在Designer中被提升为)并在setupUi()之后显式调用它。从那以后,您甚至可以更灵活地将此子类与非只读表一起使用。