首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QTableView实现

QTableView实现
EN

Code Review用户
提问于 2020-06-27 21:45:50
回答 1查看 77关注 0票数 2

我使用Qt的QTableView和自定义数据模型将第一个表组合在一起。目前,一些数据是在初始化时填充的,用户可以选择添加和删除条目。

代码语言:javascript
复制
#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);

}

虽然我担心我可能使用QTableView不正确和/或效率低下,但一切都很好。任何建议,如何改善我的代码,同时保持相同的功能,将不胜感激。

EN

回答 1

Code Review用户

发布于 2020-07-22 13:16:31

我找不到wrong.If真正给出的一些建议,函数名'on_AddButton_clicked‘和’on_deleteButton_clicked‘的情况会更好地使用'addButton’和‘删除按钮’。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/244637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档