qt 一个简单的表格程序

来源:互联网 发布:淘宝app 私人定制 编辑:程序博客网 时间:2024/05/16 12:31
#-------------------------------------------------## Project created by QtCreator 2017-01-10T10:36:15##-------------------------------------------------QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = readonlyTEMPLATE = appSOURCES += main.cpp\        mymodel.cppHEADERS  += mymodel.hFORMS    += mymodel.ui


#ifndef MYMODEL_H#define MYMODEL_H// mymodel.h#include <QAbstractTableModel>class MyModel : public QAbstractTableModel{    Q_OBJECTpublic:    MyModel(QObject *parent);    int rowCount(const QModelIndex &parent = QModelIndex()) const;    int columnCount(const QModelIndex &parent = QModelIndex()) const;    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;};#endif // MYMODEL_H

// mymodel.cpp#include "mymodel.h"MyModel::MyModel(QObject *parent){}int MyModel::rowCount(const QModelIndex &parent) const{    return 2;}int MyModel::columnCount(const QModelIndex &parent) const{    return 3;}QVariant MyModel::data(const QModelIndex &index, int role) const{    if (role == Qt::DisplayRole)    {        return QString("Row%1, Column%2")                .arg(index.row() + 1)                .arg(index.column() + 1);    }    return QVariant();}

#include "mymodel.h"#include <QApplication>#include <QTableView>int main(int argc, char *argv[]){    QApplication a(argc, argv);    QTableView tableView;    MyModel myModel(0);    tableView.setModel(&myModel);    tableView.show();    return a.exec();}

有些虚函数需要继承QAbstractTableModel,

// 设置行数

     int rowCount(const QModelIndex &parent) const;
// 设置列数   

int columnCount(const QModelIndex &parent) const;

// 显示表格数据

    QVariant data(const QModelIndex &index, int role) const;

// 设置表格数据 

  bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);

// 设置表格头

    QVariant headerData(int section, Qt::Orientation orientation, int role) const;

// 设置表格格式,比如是否可编辑

   Qt::ItemFlags flags(const QModelIndex &index) const;

 对应的都需要实现,可以设置私有变量m_gridData用于保存数据。

树型布局代码示例:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {    treeView = new QTreeView(this);    setCentralWidget(treeView);    standardModel = new QStandardItemModel;    QList<QStandardItem *> preparedRow = prepareRow("first", "second", "third");    QStandardItem *item = standardModel->invisibleRootItem();    // adding a row to the invisible root item produces a root element    item->appendRow(preparedRow);    QList<QStandardItem *> secondRow =prepareRow("111", "222", "333");    // adding a row to an item starts a subtree    preparedRow.first()->appendRow(secondRow);    treeView->setModel(standardModel);    treeView->expandAll();}QList<QStandardItem *> MainWindow::prepareRow(const QString &first, const QString &second, const QString &third){    QList<QStandardItem *> rowItems;    rowItems << new QStandardItem(first);    rowItems << new QStandardItem(second);    rowItems << new QStandardItem(third);    return rowItems;}
行头以"first", "second", "third"开头,以 ”111“, ”222“, ”333“结尾。


利用selectionMode改变窗口显示

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QTreeView>#include <QStandardItemModel>class MainWindow : public QMainWindow{    Q_OBJECTpublic:    MainWindow(QWidget *parent = 0);    ~MainWindow();public slots:    void selectionChangedSlot(const QItemSelection & /*newSelection*/,                              const QItemSelection & /*oldSelection*/);private:    QTreeView *treeView;    QStandardItemModel *standardModel;};#endif // MAINWINDOW_H



#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent){    treeView = new QTreeView(this);    setCentralWidget(treeView);    standardModel = new QStandardItemModel;    QStandardItem *rootNode = standardModel->invisibleRootItem();    // defining a couple of items    QStandardItem *americalItem = new QStandardItem("America");    QStandardItem *canadaItem = new QStandardItem("Canada");    QStandardItem *usaItem = new QStandardItem("USA");    QStandardItem *bostonItem = new QStandardItem("Boston");    QStandardItem *europeItem = new QStandardItem("Europe");    QStandardItem *italyItem = new QStandardItem("Italy");    QStandardItem *romeItem = new QStandardItem("Rome");    QStandardItem *veronaItem = new QStandardItem("verona");    // building up the hierarchy    rootNode->appendRow(americalItem);    rootNode->appendRow(europeItem);    americalItem->appendRow(canadaItem);    americalItem->appendRow(usaItem);    usaItem->appendRow(bostonItem);    europeItem->appendRow(italyItem);    italyItem->appendRow(romeItem);    italyItem->appendRow(veronaItem);    // register the model    treeView->setModel(standardModel);    treeView->expandAll();    // selection changes shall triger a slot    QItemSelectionModel *selectionModel = treeView->selectionModel();    connect(selectionModel, SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),            this, SLOT(selectionChangedSlot(const QItemSelection &, const QItemSelection &)));}MainWindow::~MainWindow(){}void MainWindow::selectionChangedSlot(const QItemSelection &, const QItemSelection &){    // get the text of the selected item    const QModelIndex index = treeView->selectionModel()->currentIndex();    QString selectedText = index.data(Qt::DisplayRole).toString();    // find out the hierarchy level of the selected item    int hierarchyLevel = 1;    QModelIndex seekRoot = index;    while (seekRoot.parent() != QModelIndex()) {        seekRoot = seekRoot.parent();        hierarchyLevel++;    }    QString showString = QString("%1, Level %2").arg(selectedText)            .arg(hierarchyLevel);    setWindowTitle(showString);}


0 0
原创粉丝点击