This is a simple example to display read-only data that is tabular in nature using Qt's Model/View Framework. Specifically, the Qt Objects
QAbstractTableModel (sub-classed in this example) and QTableView are used.
Implementations of the methods rowCount(), columnCount(), data() and headerData() are required to give the QTableView
object a means to obtain information about the data contained in the QAbstractTableModel
object.
The method populateData()
was added to this example to provide a means to populate the QAbstractTableModel
object with data from some arbitrary source.
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QAbstractTableModel>
namespace Ui {
class MainWindow;
}
class TestModel : public QAbstractTableModel
{
Q_OBJECT
public:
TestModel(QObject *parent = 0);
void populateData(const QList<QString> &contactName,const QList<QString> &contactPhone);
int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
int columnCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
private:
QList<QString> tm_contact_name;
QList<QString> tm_contact_phone;
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QList<QString> contactNames;
QList<QString> contactPhoneNums;
// Create some data that is tabular in nature:
contactNames.append("Thomas");
contactNames.append("Richard");
contactNames.append("Harrison");
contactPhoneNums.append("123-456-7890");
contactPhoneNums.append("222-333-4444");
contactPhoneNums.append("333-444-5555");
// Create model:
TestModel *PhoneBookModel = new TestModel(this);
// Populate model with data:
PhoneBookModel->populateData(contactNames,contactPhoneNums);
// Connect model to table view:
ui->tableView->setModel(PhoneBookModel);
// Make table header visible and display table:
ui->tableView->horizontalHeader()->setVisible(true);
ui->tableView->show();
}
MainWindow::~MainWindow()
{
delete ui;
}
TestModel::TestModel(QObject *parent) : QAbstractTableModel(parent)
{
}
// Create a method to populate the model with data:
void TestModel::populateData(const QList<QString> &contactName,const QList<QString> &contactPhone)
{
tm_contact_name.clear();
tm_contact_name = contactName;
tm_contact_phone.clear();
tm_contact_phone = contactPhone;
return;
}
int TestModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return tm_contact_name.length();
}
int TestModel::columnCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return 2;
}
QVariant TestModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid() || role != Qt::DisplayRole) {
return QVariant();
}
if (index.column() == 0) {
return tm_contact_name[index.row()];
} else if (index.column() == 1) {
return tm_contact_phone[index.row()];
}
return QVariant();
}
QVariant TestModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
if (section == 0) {
return QString("Name");
} else if (section == 1) {
return QString("Phone");
}
}
return QVariant();
}
Using Qt Creator/Design
, place a Table View
object, named tableView in this example, in the main window:
The resulting program displays as: