(C++) QTableViewExample7
February 24, 2017 · View on GitHub
(C++) QTableViewExample7



QTableView example 7: two views on one model with a custom data type is a QTableView example.
- View a screenshot of 'QTableViewExample7' (png)
- Download the Qt Creator project 'QTableViewExample7' (zip)
Technical facts
Operating system(s) or programming environment(s)
Lubuntu 15.04 (vivid)
Qt Creator 3.1.1
- G++ 4.9.2
Libraries used:
Qt project file: ./CppQTableViewExample7/CppQTableViewExample7.pro
QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets QMAKE_CXXFLAGS += -Wall -Wextra -Werror TEMPLATE = app QMAKE_CXXFLAGS += -std=c++11 SOURCES += \ qtdialog.cpp \ qtmain.cpp \ mydata.cpp \ mymodel.cpp HEADERS += qtdialog.h \ mydata.h \ mymodel.h FORMS += qtdialog.ui
./CppQTableViewExample7/mydata.h
#ifndef MYDATA_H #define MYDATA_H #include <boost/numeric/ublas/matrix.hpp> ///Plain interface to a matrix struct MyData { MyData(const int n_rows = 4, const int n_cols = 3); double Get(const int row, const int col) const; int GetColCount() const; int GetRowCount() const; void Set(const int row, const int col, const double value); private: boost::numeric::ublas::matrix<double> m_v; }; #endif // MYDATA_H
./CppQTableViewExample7/mydata.cpp
#include "mydata.h" #include <cassert> #include <boost/numeric/conversion/cast.hpp> MyData::MyData(const int n_rows, const int n_cols) : m_v(n_rows,n_cols) { for (int row = 0; row!=n_rows; ++row) { const double denominator = boost::numeric_cast<double>(row + 1); for (int col = 0; col!=n_cols; ++col) { const double numerator = boost::numeric_cast<double>(col + 1); m_v(row,col) = numerator / denominator; } } } double MyData::Get(const int row, const int col) const { assert(row < boost::numeric_cast<int>(m_v.size1())); assert(col < boost::numeric_cast<int>(m_v.size2())); return m_v(row,col); } int MyData::GetColCount() const { return boost::numeric_cast<int>(m_v.size2()); } int MyData::GetRowCount() const { return boost::numeric_cast<int>(m_v.size1()); } void MyData::Set(const int row, const int col, const double value) { assert(row < boost::numeric_cast<int>(m_v.size1())); assert(col < boost::numeric_cast<int>(m_v.size2())); m_v(row,col) = value; }
./CppQTableViewExample7/mymodel.h
#ifndef MYMODEL_H #define MYMODEL_H #include <QAbstractTableModel> #include "mydata.h" //I did not use QStandardItemModel because I did not work with QStandardItem struct MyModel : public QAbstractTableModel { MyModel(QObject *parent = 0); //Must be defined from ABC QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; ///These flags are needed to allow editing Qt::ItemFlags flags(const QModelIndex &index) const; ///Working with the raw data MyData& GetData() { return m_data; } const MyData& GetData() const { return m_data; } ///Needed for editable data bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); ///Must be defined from ABC int rowCount(const QModelIndex &parent = QModelIndex()) const; ///Must be defined from ABC int columnCount(const QModelIndex &parent = QModelIndex()) const; private: ///The raw data MyData m_data; }; #endif // MYMODEL_H
./CppQTableViewExample7/mymodel.cpp
#include "mymodel.h" #include <cassert> #include <boost/lexical_cast.hpp> MyModel::MyModel(QObject *parent) : QAbstractTableModel(parent) { } QVariant MyModel::data(const QModelIndex &index, int role) const { //Removing this line will cause checkboxes to appear if (role != Qt::EditRole && role != Qt::DisplayRole) return QVariant(); assert(index.isValid()); return m_data.Get(index.row(),index.column()); } Qt::ItemFlags MyModel::flags(const QModelIndex &) const { return Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsEnabled; } int MyModel::rowCount(const QModelIndex &) const { return m_data.GetRowCount(); } int MyModel::columnCount(const QModelIndex &) const { return m_data.GetColCount(); } bool MyModel::setData(const QModelIndex &index, const QVariant &value, int /* role */) { m_data.Set(index.row(),index.column(),value.toDouble()); ///This line below is needed to let the two views synchronize emit dataChanged(index,index); //Editing succeeded! return true; }
./CppQTableViewExample7/qtdialog.h
#ifndef QTDIALOG_H #define QTDIALOG_H #include <QDialog> namespace Ui { class QtDialog; } class QtDialog : public QDialog { Q_OBJECT public: explicit QtDialog(QWidget *parent = 0); ~QtDialog(); private slots: private: Ui::QtDialog *ui; }; #endif // QTDIALOG_H
./CppQTableViewExample7/qtdialog.cpp
#include "qtdialog.h" #include <cassert> #include "mymodel.h" #include "ui_qtdialog.h" QtDialog::QtDialog(QWidget *parent) : QDialog(parent), ui(new Ui::QtDialog) { ui->setupUi(this); MyModel * const model = new MyModel(this); assert(model); ui->table_left->setModel(model); ui->table_right->setModel(model); assert(ui->table_left->model()); assert(ui->table_right->model()); assert(ui->table_left->model() == model); assert(ui->table_right->model() == model); } QtDialog::~QtDialog() { delete ui; }
./CppQTableViewExample7/qtmain.cpp
#include <QApplication> #include "qtdialog.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); QtDialog w; w.show(); return a.exec(); }