2017-01-23 39 views
0

我们有一个QTableView,其中填充了一些任意数据。用户可以通过使verticalHeader可移动来重新排列表格的行。下面是一个示例代码:读取QTableView行内容的顺序与所看到的顺序不同

#include <QApplication> 
#include <QTableWidget> 
#include <QDebug> 
#include <QVBoxLayout> 
#include <QPushButton> 
#include <QHeaderView> 

int main(int argc, char* argv[]) 
{ 
    QApplication a(argc, argv); 
    QWidget base; 
    QTableWidget* tablWid = new QTableWidget(&base); 
    tablWid->verticalHeader()->setSectionsMovable(true); 
    tablWid->verticalHeader()->setDragEnabled(true); 
    ////////////////////////////////////////////////////////////////////////// 
    // Fill the model with some data 
    tablWid->model()->insertColumn(0); 
    tablWid->model()->insertRows(0,10); 
    for (int i = 0; i < 10; ++i) 
     tablWid->model()->setData(tablWid->model()->index(i, 0), "Item " + QString::number(i)); 
    ////////////////////////////////////////////////////////////////////////// 
    QPushButton* dumpButton = new QPushButton("Dump Model", &base); 
    QObject::connect(dumpButton, &QPushButton::clicked, [tablWid]()->void { 
     for (int j = 0; j < tablWid->model()->rowCount();++j){ 
      qDebug() << tablWid->model()->index(j, 0).data().toString(); 
     } 
    }); 
    QVBoxLayout* baseLay = new QVBoxLayout(&base); 
    baseLay->addWidget(tablWid); 
    baseLay->addWidget(dumpButton); 
    base.show(); 
    return a.exec(); 
} 

我们希望在相同的顺序是出现在QTableView中(如在没有存储在模型视图中看到)来读取单元格内容。目前通过调用model-> data(),我们访问存储在模型中的单元格内容,而不是像在视图中看到的那样(通过垂直部分移动来改变排序)。

如何以这种方式读取单元格内容?

回答

1

所以,如果我正确地理解它,你想通过移动标题来重新排序列,然后想知道视图是怎样的。 我相信(90%肯定)重新排列标题时,它不会触发模型中的任何更改!然后如果您刚刚开始打印模型的数据,则只会按照最初的顺序来查看数据,然后才能使用标题交换/重新排列某列。

但你可以保持自己的小数据结构保持头的顺序,当你将重新排列头插槽columnMoved()会在那个时间点invooked你可以利用该方法columnViewportPosition找出所有的位置列和更新你的小数据结构存储列的顺序。

因此,在打印数据时,您应该始终假定标题的顺序与您自己的数据结构中的顺序相同。

希望能做到你正在寻找的东西!

+0

谢谢,这是一种方法。但是,我认为可能还有最简单的方法! – Mosi

+1

或者,您也可以在基于由columnMoved上的columnViewportPosition计算的新订单的情况下对模型执行实际交换,而不是维护自己的结构! 但是,这也会触发您可能不感兴趣的模型更新,并应在执行此类交换时使用QSignalBlocker阻止它们! 发布更简单的方法,如果你能找到一个;) 干杯! – PRIME