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);
}
相关文章推荐
- linux下qt的安装和一个最简单的小程序hello world
- 利用QT写一个极简单的图形化Python闹钟程序
- QT入门-一个简单的计算器程序
- qt-opengl 初学的一个简单的程序
- 【C++ in Qt5】一个简单的通讯录程序,支持文件存取
- 一个最简单的hello_qt程序
- 今天终于将qt-opengl 的一个简单的程序写出来了,
- 利用QT编写一个简单爬虫程序
- C++/Qt中一个简单的加密解密程序
- 一个简单的 Qt GUI 程序
- 04 QT实现一个简单的看图程序
- 如何用C++与QT来写一个简单的程序
- 一个简单的Qt socket 程序
- Qt入门-构建一个简单的窗体程序
- 我写的一个简单的聊天程序(bcb)
- 一个SAX解析xml的简单程序。
- 一个简单的投票程序
- 用C#写的一个简单屏幕保护程序
- 用javascript实现的一个简单抽奖小程序
- 『Visual C++ MFC 简明教程』----第二部分:一个简单的MFC程序