Qt 在tableview中通过setIndexWideget添加widget显示错位问题

it2022-05-05  169

在 QtableVIew中添加添加静态窗体可以直接使用setIndexWidget()函数,比如;

QComboBox *idCom = new QComboBox();  idCom->setFocusPolicy(Qt::NoFocus);

m_ptTbView->setIndexWidget(m_ptTbModel->indexFromItem(ptIdItem), idCom);

但是当tableview中行数比较多的时候,当滚动条不再最顶端的时候,widget就会发生错位现象;

解决办法:

1  这是由于scrollbar导致的,可以在添加之前将scrollbar关闭,添加完成后再重新打开,如:

    m_ptTbView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //先关闭滚动条

    m_ptTbView->setIndexWidget(m_ptTbModel->indexFromItem(ptIdItem), idCom); //添加widget

   m_ptTbView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);//重新打开滚动条

2 可以使用QtableView中的updateGeometries(),由于这个函数是protected虚函数函数,所以需要重写tableview, 

class MyQTableView : public QTableView { public: inline void publicUpdateGeometries() { updateGeometries(); } }; void MainWindow::DeletePressed(int row) { table_->clearSelection(); // <- added clear selection before remove row table_->removeRow(row); // call the protected method QTableView::updateGeometries() ((MyQTableView*) table_)->publicUpdateGeometries(); }

最新回复(0)