TransWikia.com

QTableView implementation

Code Review Asked by 19172281 on November 25, 2021

I’ve put together my first table using Qt’s QTableView and a custom data model. Currently, some data is populated on initialisation, and the user has the option of adding and deleting entries.

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
using namespace std;
QList<Contact> contacts;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QList<QString> contactNames;
    QList<QString> contactPhoneNums;

    contacts.append(Contact{4,"Adam"});
    contacts.append(Contact{5,"James"});
    contacts.append(Contact{2,"Emily"});
    contacts.append(Contact{1,"Mark"});

    // Create model:
    PhoneBookModel = new TestModel(this);

    // Connect model to table view:
    ui->tableView->setModel(PhoneBookModel);
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    ui->tableView->setSelectionMode( QAbstractItemView::SingleSelection );

    // Make table header visible and display table:
    ui->tableView->horizontalHeader()->setVisible(true);
    ui->tableView->show();

    //slots to signals

    connect(ui->tableView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &MainWindow::foo);

}

void MainWindow::foo(){
    QItemSelectionModel *selected = ui->tableView->selectionModel();
    QModelIndexList rowList = selected->selectedRows();

    if (rowList.size() == 0){
        ui->label->setText("YAY");
        ui->tableView->selectRow(0);

    } else {
        ui->label->setText(contacts.at(rowList.at(0).row()).name);
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}

TestModel::TestModel(QObject *parent) : QAbstractTableModel(parent)
{
}

int TestModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return contacts.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 contacts[index.row()].id;
    } else if (index.column() == 1) {
        return contacts[index.row()].name;
    }
    return QVariant();
}

void TestModel::update(int row){

   QModelIndex i = this->index(row,0,QModelIndex());
   QModelIndex p = this->index(row,1,QModelIndex());

   emit dataChanged(i,p);
   emit layoutChanged();
}

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();
}

void MainWindow::on_DeleteButton_clicked()
{
    QItemSelectionModel *selected = ui->tableView->selectionModel();
    QModelIndexList rowList = selected->selectedRows();


    for (int i = 0; i < rowList.count(); i++)
    {

        contacts.removeAt(rowList.at(i).row());
        if (rowList.at(i).row() == contacts.size()){ //last element
            ui->tableView->selectRow(rowList.at(i).row()-1);

        } else {

        }

        PhoneBookModel->update(rowList.at(i).row());
        foo();

    }

}

void MainWindow::on_AddButton_clicked()
{
    int id = ui->id->text().toInt();
    QString name = ui->name->text();

    contacts.append(Contact{id,name});

    PhoneBookModel->update(contacts.size()-1);

}

It all works fine, although I worry that I may be using QTableView incorrectly and/or inefficiently. Any suggestions on how to improve my code while maintaining the same functionality would be appreciated.

One Answer

I can't find anything wrong.If really give some suggestions, it would be the case of the function name 'on_AddButton_clicked' and 'on_DeleteButton_clicked'.It will be better to use 'addButton' and 'deleteButton'.

Answered by StephennQin on November 25, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP