Столкнулся с одной проблемой. У меня есть таблица, в которой по нажатию кнопок можно добавлять, вставлять между существующих строк и удалять строчки. Когда все строки удалены и я снова нажимаю на кнопку удалить, то программа вылетает.
И тоже самое с кнопкой insert. Не могу исправить ошибку. Понимаю, что в коде ошибка, но как реализовать это по другому - не знаю. Пытался прописывать ограничения, тоже ничего не вышло. Буду благодарен за помощь! Вот мой полный код:
Файл mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "mymodel.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
private:
Ui::MainWindow *ui;
MyModel *Model;
};
#endif // MAINWINDOW_H
Файл mymodel.h
#ifndef MYMODEL_H
#define MYMODEL_H
#include <QAbstractTableModel>
#include <QVector>
#include "sport.h"
class MyModel : public QAbstractTableModel
{
Q_OBJECT
public:
explicit MyModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const ;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
Qt::ItemFlags flags(const QModelIndex & index) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
bool insertRows(int row, int count, const QModelIndex & parent = QModelIndex());
bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex());
signals:
// void editCompleted(const QString &);
public slots:
private:
QVector<Sport> GridData;
};
#endif // MYMODEL_H
Файл sport.h
#ifndef SPORT_H
#define SPORT_H
#include <QString>
class Sport
{ public:
Sport ();
Sport (QString name, QString code);
Sport (const Sport& v);
Sport& operator= (const Sport&);
QString name () const;
QString code () const;
float ball () const;
int mesto () const;
void setName (QString name);
void setCode (QString code);
void setMesto (int m);
void setBall (float b);
private:
QString Name, Code;
float Ball;
int Mesto;
};
#endif // SPORT_H
Файл mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
Model = new MyModel;
ui->tableView->setModel(Model);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
//add
int row = Model->rowCount();
Model->insertRows(row, 1);
QModelIndex in = Model->index(row, 1);
ui->tableView->setCurrentIndex(in);
ui->tableView->edit(in);
}
void MainWindow::on_pushButton_2_clicked()
{
//insert
int row = ui->tableView->currentIndex().row();
Model->insertRows(row, 1);
QModelIndex in = Model->index(row, 1);
ui->tableView->setCurrentIndex(in);
}
void MainWindow::on_pushButton_3_clicked()
{
//delete
Model->removeRows(ui->tableView->currentIndex().row(),1);
}
Файл mymodel.cpp
#include "mymodel.h"
MyModel::MyModel(QObject *parent) : QAbstractTableModel(parent)
{
GridData.resize(1);
}
int MyModel::rowCount(const QModelIndex &parent) const
{
return GridData.size();
}
int MyModel::columnCount(const QModelIndex &parent) const
{
return 4;
}
QVariant MyModel::data(const QModelIndex &index, int role) const
{
if (role == Qt::DisplayRole)
{
switch (index.column())
{
case 0:
return GridData[index.row()].name();
case 1:
return GridData[index.row()].code();
case 2:
return GridData[index.row()].ball();
case 3:
return GridData[index.row()].mesto();
default:
break;
}
}
return QVariant();
}
QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role == Qt::DisplayRole && orientation == Qt::Horizontal)
{
switch (section)
{
case 0:
return QVariant("Фамилия участника");
case 1:
return QVariant("Код команды");
case 2:
return QVariant("Количество балов");
case 3:
return QVariant("Место в итоге");
default:
break;
}
}
return QVariant();
}
bool MyModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (role == Qt::EditRole)
{
//save value from editor to member m_gridData
// m_gridData[index.row()][index.column()] = value.toString();
switch (index.column())
{
case 0:
GridData[index.row()].setName(value.toString());
break;
case 1:
GridData[index.row()].setCode(value.toString());
break;
case 2:
GridData[index.row()].setBall(value.toInt());
break;
case 3:
GridData[index.row()].setMesto(value.toInt());
break;
}
}
return true;
}
Qt::ItemFlags MyModel::flags(const QModelIndex &index) const
{
return Qt::ItemIsEditable | QAbstractTableModel::flags(index);
}
bool MyModel::insertRows(int row, int count, const QModelIndex &parent)
{
beginInsertRows(parent,row, row + count - 1);
GridData.insert(row, count, Sport());
endInsertRows();
return true;
}
bool MyModel::removeRows(int row, int count, const QModelIndex &parent)
{
beginRemoveRows(parent,row, row + count - 1);
GridData.remove(row, count);
endRemoveRows();
return true;
}
Файл sport.cpp
#include "sport.h"
Sport::Sport():
Ball(0.0), Mesto(0)
{
}
Sport::Sport(QString name, QString code):
Name(name), Code(code), Ball(0.0), Mesto(0)
{
}
Sport::Sport(const Sport &v)
{
this->Name = v.Name;
this->Code = v.Code;
this->Ball = v.Ball;
this->Mesto = v.Mesto;
}
Sport &Sport::operator =(const Sport &v)
{
this->Name = v.Name;
this->Code = v.Code;
this->Ball = v.Ball;
this->Mesto = v.Mesto;
return *this;
}
QString Sport::name() const
{
return Name;
}
QString Sport::code() const
{
return Code;
}
float Sport::ball() const
{
return Ball;
}
int Sport::mesto() const
{
return Mesto;
}
void Sport::setName(QString name)
{
this->Name = name;
}
void Sport::setCode(QString code)
{
this->Code = code;
}
void Sport::setBall(float b)
{
this->Ball = b;
}
void Sport::setMesto(int m)
{
this->Mesto = m;
}
Вот)
void MainWindow::on_pushButton_clicked()
{
//add
int row = Model->rowCount();
Model->insertRows(row, 1);
QModelIndex in = Model->index(row, 1);
ui->tableView->setCurrentIndex(in);
ui->tableView->edit(in);
ui->pushButton_3->setEnabled(Model->rowCount());
ui->pushButton_2->setEnabled(Model->rowCount());
}
void MainWindow::on_pushButton_2_clicked()
{
//insert
int row = ui->tableView->currentIndex().row();
Model->insertRows(row, 1);
QModelIndex in = Model->index(row, 1);
ui->tableView->setCurrentIndex(in);
}
void MainWindow::on_pushButton_3_clicked()
{
//delete
Model->removeRows(ui->tableView->currentIndex().row(), 1);
ui->pushButton_3->setEnabled(Model->rowCount());
ui->pushButton_2->setEnabled(Model->rowCount());
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть картридер для чтения карт с магнитной полосойОперационная система его "задействует" как клавиатуру
Подскажите пожалуйста, есть ли в новых версиях стандарта c++ или в стандартной библиотеке функционал работы с битами в больших массивах данных
Для JavaFX-приложения использую связку: Сontrollerjava, Main
между таблицами у меня связь один ко многим, использую аннотацию @JoinColumn, насколько понимаю при этой аннотации просто добавляется дополнительный...