我使用Qt的QTableView和自定义数据模型将第一个表组合在一起。目前,一些数据是在初始化时填充的,用户可以选择添加和删除条目。
#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不正确和/或效率低下,但一切都很好。任何建议,如何改善我的代码,同时保持相同的功能,将不胜感激。
发布于 2020-07-22 13:16:31
我找不到wrong.If真正给出的一些建议,函数名'on_AddButton_clicked‘和’on_deleteButton_clicked‘的情况会更好地使用'addButton’和‘删除按钮’。
https://codereview.stackexchange.com/questions/244637
复制相似问题