Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 交换QSqlQueryModel中的头(转置表)_C++_Qt_Qt5_Qsqlquery - Fatal编程技术网

C++ 交换QSqlQueryModel中的头(转置表)

C++ 交换QSqlQueryModel中的头(转置表),c++,qt,qt5,qsqlquery,C++,Qt,Qt5,Qsqlquery,我在正确转置从db接收的表时遇到问题。我遵循找到的路径,最终对QabStretcProxyModel进行了子类化,如所述。 不幸的是,它没有完全起作用,问题在于: 我所拥有的: 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 如您所见,数

我在正确转置从db接收的表时遇到问题。我遵循找到的路径,最终对QabStretcProxyModel进行了子类化,如所述。 不幸的是,它没有完全起作用,问题在于:

我所拥有的:

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
如您所见,数据已正确转置,但标题变差了。。。我真的需要它们:(

我试图手动设置标题数据,但也失败了:

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
}
origModel=newqsqlquerymodel;//设置查询等
transposedModel=新的TransposedProxyModel;
transposedModel->setSourceModel(原始模型);
对于(int i=0;icolumnCount();i++){
qDebug()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();
}
#包括
#包括
类TransportSeProxyModel:PublicQAbstractProxyModel{
公众:
TransposeProxyModel(QObject*p=0):
QAbstractProxyModel(p)
{
}
QModelIndex mapFromSource(常量QModelIndex和sourceIndex)常量{
返回索引(sourceIndex.column(),sourceIndex.row());
}
QModelIndex映射源(常数QModelIndex&proxyIndex)常数{
return sourceModel()->index(proxyIndex.column(),proxyIndex.row());
}
QModelIndex索引(int r,int c,常量QModelIndex&ind=QModelIndex())常量{
返回createIndex(r,c);
}
QModelIndex父项(常量QModelIndex&)常量{
返回QModelIndex();
}
int行计数(常量QModelIndex&)常量{
返回sourceModel()->columnCount();
}
int columnCount(常量QModelIndex&)常量{
返回sourceModel()->rowCount();
}
QVariant数据(常量QModelIndex&ind,int角色)常量{
返回sourceModel()->数据(mapToSource(ind),角色);
}
QVariant headerData(内部部分,Qt::方向,
int role=Qt::DisplayRole)常量{
返回sourceModel()->headerData(第节,
(方向==Qt::水平?Qt::垂直:Qt::水平),
角色);
}
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QS标准模型(3,3);
模型集数据(模型索引(0,0),“1”);
模型集数据(模型指数(0,1),“2”);
模型集数据(模型指数(0,2),“3”);
模型集数据(模型索引(1,0),“4”);
模型集数据(模型索引(1,1),“5”);
模型集数据(模型索引(1,2),“6”);
模型集数据(模型索引(2,0),“7”);
模型集数据(模型索引(2,1),“8”);
模型集数据(模型索引(2,2),“9”);
model.setHeaderData(0,Qt::水平,“a”);
model.setHeaderData(1,Qt::水平,“b”);
型号:setHeaderData(2,Qt::水平,“c”);
转位模型;
trans.setSourceModel(&model);
qspliter分裂;
QTableView*t1=新的QTableView(&split);
t1->setModel(&model);
QTableView*t2=新的QTableView(&split);
t2->setModel(&trans);
split.show();
返回a.exec();
}

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

如果使用链接的示例代码,您应该覆盖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();
}
#包括
#包括
类TransportSeProxyModel:PublicQAbstractProxyModel{
公众:
TransposeProxyModel(QObject*p=0):
QAbstractProxyModel(p)
{
}
QModelIndex mapFromSource(常量QModelIndex和sourceIndex)常量{
返回索引(sourceIndex.column(),sourceIndex.row());
}
QModelIndex映射源(常数QModelIndex&proxyIndex)常数{
return sourceModel()->index(proxyIndex.column(),proxyIndex.row());
}
QModelIndex索引(int r,int c,常量QModelIndex&ind=QModelIndex())常量{
返回createIndex(r,c);
}
QModelIndex父项(常量QModelIndex&)常量{
返回QModelIndex();
}
int行计数(常量QModelIndex&)常量{
返回sourceModel()->columnCount();
}
int columnCount(常量QModelIndex&)常量{
返回sourceModel()->rowCount();
}
QVariant数据(常量QModelIndex&ind,int角色)常量{
返回sourceModel()->数据(mapToSource(ind),角色);
}
QVariant headerData(内部部分,Qt::方向,
int role=Qt::DisplayRole)常量{
返回sourceModel()->headerData(第节,
(方向==Qt::水平?Qt::垂直:Qt::水平),
角色);
}
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QS标准模型(3,3);
模型集数据(模型索引(0,0),“1”);
模型集数据(模型指数(0,1),“2”);
模型集数据(模型指数(0,2),“3”);
模型集数据(模型索引(1,0),“4”);
模型集数据(模型索引(1,1),“5”);
模型集数据(模型索引(1,2),“6”);
模型集数据(模型索引(2,0),“7”);
模型集数据(模型索引(2,1),“8”);
模型集数据(模型索引(2,2),“9”);
model.setHeaderData(0,Qt::水平,“a”);
model.setHeaderData(1,Qt::水平,“b”);
型号:setHeaderData(2,Qt::水平,“c”);
转位模型;
trans.setSourceModel(&M)模式
sim = new QStandardItemModel (3,3);

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++ ) {
        sim->setData(sim->index(i,j), QString("%1%2").arg(QChar(j+65), QString().setNum(i+1)));
        if (i==0)
            sim->setHeaderData(j, Qt::Horizontal, QChar(j+65));
    }
    sim->setHeaderData(i, Qt::Vertical, i+1);
}

transposedModel = new TransposeProxyModel;
transposedModel->setSourceModel(sim);

QAbstractItemModel * aim = transposedModel;
QAbstractProxyModel *apm = transposedModel;

for (int i = 0; i < apm->rowCount(); i++) {
    qDebug() << "aim->Qt::Vertical(" << i << ")" << aim->headerData(i, Qt::Vertical, Qt::DisplayRole);
    qDebug() << "apm->Qt::Vertical(" << i << ")" << apm->headerData(i, Qt::Vertical, Qt::DisplayRole);
    qDebug() << "transposedModel->Qt::Vertical(" << i << ")" << transposedModel->headerData(i, Qt::Vertical, Qt::DisplayRole);
}
aim->Qt::Vertical( 0 ) QVariant(int, 1) 
apm->Qt::Vertical( 0 ) QVariant(int, 1) 
[ TransposeProxyModel::headerData ] //qDebug in TransposeProxyModel::headerData
transposedModel->Qt::Vertical( 0 ) QVariant(QChar, 'A') 
aim->Qt::Vertical( 1 ) QVariant(int, 1) 
apm->Qt::Vertical( 1 ) QVariant(int, 1) 
[ TransposeProxyModel::headerData ] //qDebug in TransposeProxyModel::headerData
transposedModel->Qt::Vertical( 1 ) QVariant(QChar, 'B') 
aim->Qt::Vertical( 2 ) QVariant(int, 1) 
apm->Qt::Vertical( 2 ) QVariant(int, 1) 
[ TransposeProxyModel::headerData ] //qDebug in TransposeProxyModel::headerData
transposedModel->Qt::Vertical( 2 ) QVariant(QChar, 'C') 
/*!
    \reimp
 */
QVariant QAbstractProxyModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    Q_D(const QAbstractProxyModel);
    int sourceSection;
    if (orientation == Qt::Horizontal) {
        const QModelIndex proxyIndex = index(0, section);
        sourceSection = mapToSource(proxyIndex).column();
    } else {
        const QModelIndex proxyIndex = index(section, 0);
        sourceSection = mapToSource(proxyIndex).row();
    }
    return d->model->headerData(sourceSection, orientation, role);
}