gpt4 book ai didi

c++ - 在 QSqlQueryModel 中交换表头(转置表)

转载 作者:行者123 更新时间:2023-11-30 01:51:32 25 4
gpt4 key购买 nike

我在正确转置从 db 收到的表时遇到问题。我按照找到的路径 here ,并最终继承了 QAbstractProxyModel - 如描述的那样 here .不幸的是,它不能完全工作,这就是问题所在:

我有什么:

X | A  | B
----------
1 | A1 | B1
2 | A2 | B2

我想要的:

X | 1  | 2
----------
A | A1 | A2
B | B1 | B2

我得到的:

X | 1  | 1
----------
A | A1 | A2
A | B1 | B2

如您所见,数据已正确转置,但 header 变坏了......我真的需要它们:(

我试过手动设置header数据,也失败了:

origModel = new QSqlQueryModel; // set query and so on
transposedModel = new TransposeProxyModel;
transposedModel->setSourceModel(origModel );
for (int i = 0; i < origModel->columnCount(); i++) {
qDebug() << "origModel->Qt::Horizontal(" << i << ")" << origModel->headerData(i, Qt::Horizontal, Qt::DisplayRole);
//transposedModel->setHeaderData(i, Qt::Vertical, origModel->headerData(i, Qt::Horizontal, Qt::DisplayRole), Qt::DisplayRole); //#try1
transposedModel->setHeaderData(i, Qt::Vertical, QVariant( "abc" ), Qt::DisplayRole); // #try2
}

无论我尝试 #1 还是 #2 - 调用 setHeaderData 的结果都是 false...

有什么想法吗?

固定为@Vinícius Gobbo A. de Oliveira 指出

最佳答案

好吧,如果您使用链接的示例代码,您应该覆盖 TransposeProxyModel 类的 headerData 方法的默认定义,就像这样:

QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const {
return sourceModel()->headerData(section, (orientation == Qt::Horizontal ? Qt::Vertical : Qt::Horizontal), role);
}

忘记 setHeaderData 和 setData 方法吧:你想要一个依赖于原始模型的代理模型!

嗯,不知道到底出了什么问题,您使用的是哪个 Qt 版本?试试这段代码,它在这里工作得很好:

#include <QtCore>
#include <QtWidgets>

class TransposeProxyModel: public QAbstractProxyModel {
public:
TransposeProxyModel(QObject *p = 0):
QAbstractProxyModel(p)
{
}
QModelIndex mapFromSource ( const QModelIndex & sourceIndex ) const{
return index(sourceIndex.column(), sourceIndex.row());
}
QModelIndex mapToSource ( const QModelIndex & proxyIndex ) const{
return sourceModel()->index(proxyIndex.column(), proxyIndex.row());
}
QModelIndex index(int r, int c, const QModelIndex &ind=QModelIndex()) const{
return createIndex(r,c);
}
QModelIndex parent(const QModelIndex&) const {
return QModelIndex();
}
int rowCount(const QModelIndex &) const{
return sourceModel()->columnCount();
}
int columnCount(const QModelIndex &) const{
return sourceModel()->rowCount();
}
QVariant data(const QModelIndex &ind, int role) const {
return sourceModel()->data(mapToSource(ind), role);
}
QVariant headerData(int section, Qt::Orientation orientation,
int role = Qt::DisplayRole) const {
return sourceModel()->headerData(section,
(orientation == Qt::Horizontal ? Qt::Vertical : Qt::Horizontal),
role);
}
};

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QStandardItemModel model(3,3);
model.setData(model.index(0,0), "1");
model.setData(model.index(0,1), "2");
model.setData(model.index(0,2), "3");
model.setData(model.index(1,0), "4");
model.setData(model.index(1,1), "5");
model.setData(model.index(1,2), "6");
model.setData(model.index(2,0), "7");
model.setData(model.index(2,1), "8");
model.setData(model.index(2,2), "9");
model.setHeaderData(0, Qt::Horizontal, "a");
model.setHeaderData(1, Qt::Horizontal, "b");
model.setHeaderData(2, Qt::Horizontal, "c");
TransposeProxyModel trans;
trans.setSourceModel(&model);
QSplitter split;
QTableView *t1 = new QTableView(&split);
t1->setModel(&model);
QTableView *t2 = new QTableView(&split);
t2->setModel(&trans);
split.show();
return a.exec();
}

大部分代码来自您提供的链接,我只是写了 headerData 方法。

关于c++ - 在 QSqlQueryModel 中交换表头(转置表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26050030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com