您的位置:首页 > 编程语言 > Qt开发

qt 一个简单的表格程序

2017-01-10 10:59 447 查看
#-------------------------------------------------
#
# Project created by QtCreator 2017-01-10T10:36:15
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = readonly
TEMPLATE = app

SOURCES += main.cpp\
mymodel.cpp

HEADERS  += mymodel.h

FORMS    += mymodel.ui


#ifndef MYMODEL_H
#define MYMODEL_H

// mymodel.h
#include <QAbstractTableModel>

class MyModel : public QAbstractTableModel
{
Q_OBJECT
public:
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_OBJECT

public:
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 =
dfbe
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: