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

Iterate over QTableWidget cells in constructor?

本文关键字:QTableWidget 单元格 迭代 构造函数      更新时间:2023-10-16

我想将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设计器初始化的双击形式,我没有办法从代码中知道列/行数(除了硬编码,但我想避免这种情况),我找不到任何方法将标志应用于所有项目。

我也看到了一些修改事件本身的变通方法来防止数据修改,但我也宁愿避免这种情况。

是否有一种方法可以正确设置这些标志,或者我是否必须摆脱Qt设计器部分以添加构造函数中的所有头初始化?

嘿,这解决了你的问题…

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()和columncount () api应该正确对齐,它的item() api,而不是itemAT()。请检查。

因为你的QTableView被填充在自动生成的setupUi()(第一个小部件被创建,然后项目被添加),你可以添加一个方法像setReadOnly(bool)到你的子类(我想小部件在设计器被提升到),并显式调用它之后setupUi()。将更加灵活,因为你可以使用这个子类的非只读表以及