2014-02-08 6 views
3

Привет Я использую QTableView для отображения данных из таблицы SQL, используя QSqlTableModel asfollows:Как изменить ориентацию Qt TableView

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    model = new QSqlTableModel(this); 
    model->setTable("staging"); 
    model->select(); 
    model->setHeaderData(0, Qt::Vertical, tr("ID")); 
    model->setHeaderData(1, Qt::Vertical, tr("Region")); 
    model->setHeaderData(2, Qt::Vertical, tr("T1")); 
    model->setHeaderData(3, Qt::Vertical, tr("N1")); 
    model->setHeaderData(4, Qt::Vertical, tr("M1")); 

    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); 
    ui->tableView->setModel(model); 
    ui->tableView->showRow(1); 
    ui->tableView->resizeColumnsToContents(); 

} 

Я просто хочу, чтобы отобразить таблицу в таком представлении, представлены столбцы как строки и строки в виде столбцов. Я искал google и т. Д., Но не нашел простого решения. Существует упоминание прокси-модели, но я не уверен, как я могу реализовать это с помощью QSqltablemodel, который не использует метод данных в этом примере, а скорее оператор model-> select(), который заполняет всю модель сразу. Любые указания будут оценены.

ответ

2
class Horizontal_proxy_model : public QAbstractProxyModel { 
public: 
    Horizontal_proxy_model(QObject * parent = 0); 
    QModelIndex mapToSource(const QModelIndex &proxyIndex) const; 
    QModelIndex mapFromSource(const QModelIndex &sourceIndex) const; 
    QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; 
    QModelIndex parent(const QModelIndex &child) const; 
    int rowCount(const QModelIndex &parent) const; 
    int columnCount(const QModelIndex &parent) const; 
    QVariant headerData(int section, Qt::Orientation orientation, int role) const; 
}; 

Horizontal_proxy_model::Horizontal_proxy_model(QObject *parent) : 
    QAbstractProxyModel(parent) { 
} 

QModelIndex Horizontal_proxy_model::mapToSource(const QModelIndex &proxyIndex) const { 
    if (sourceModel()) { 
    return sourceModel()->index(proxyIndex.column(), proxyIndex.row()); 
    } else { 
    return QModelIndex(); 
    } 
} 

QModelIndex Horizontal_proxy_model::mapFromSource(const QModelIndex &sourceIndex) const { 
    return index(sourceIndex.column(), sourceIndex.row()); 
} 

QModelIndex Horizontal_proxy_model::index(int row, int column, const QModelIndex &) const { 
    return createIndex(row, column, (void*) 0); 
} 

QModelIndex Horizontal_proxy_model::parent(const QModelIndex &) const { 
    return QModelIndex(); 
} 

int Horizontal_proxy_model::rowCount(const QModelIndex &) const { 
    return sourceModel() ? sourceModel()->columnCount() : 0; 
} 

int Horizontal_proxy_model::columnCount(const QModelIndex &) const { 
    return sourceModel() ? sourceModel()->rowCount() : 0; 
} 

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

Использование:

Horizontal_proxy_model* proxy_model = new Horizontal_proxy_model(); 
proxy_model->setSourceModel(model); 
ui->tableView->setModel(proxy_model); 
Смежные вопросы