m
mihenzeЖел. 12, 2017, 11:08 Т.Ж.

QTableView и модель

Добрый вечер. Пытался сделать собственную модель представления для таблицы - вроде все работает, но есть небольшая проблема, почему то все ячейки имеют поле выбора(как у checkbox), хотя я вроде ничего такого не задавал. Подскажите пожалуйста как это исправить, нужно просто чтобы в каждой ячейке был текст без checkbox


mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QStringList>
#include <QTableView>
#include <QStandardItemModel>
#include <QVector>

#include "figure.h"
#include "mytablemodel.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

signals:
    signalAddFigure(Figure *f);

private:
    Ui::MainWindow *ui;

    MyTableModel *myModel;
    Figure *figure1;
    Figure *figure2;
    Figure *figure3;
    Figure *figure4;
    Figure *figure5;

};

#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    myModel = new MyTableModel(this);

    ui->tableView->setModel(myModel);
    connect(this, SIGNAL(signalAddFigure(Figure*)), ui->tableView->model(), SLOT(slotNewRow(Figure*)));

    figure1 = new Figure("Король", 0, 0, 0);
    emit(signalAddFigure(figure1));
    figure2 = new Figure("Ферзь", 0, 0, 0);
    emit(signalAddFigure(figure2));
    figure3 = new Figure("Ладья", 0, 0, 0);
    emit(signalAddFigure(figure3));
    figure4 = new Figure("Конь", 0, 0, 0);
    emit(signalAddFigure(figure4));
    figure5 = new Figure("Слон", 0, 0, 0);
    emit(signalAddFigure(figure5));

}

MainWindow::~MainWindow()
{
    delete ui;
}
figure.h
#ifndef FIGURE_H
#define FIGURE_H

#include <QObject>

class Figure : public QObject
{
    Q_OBJECT
public:
    Figure();
    Figure(QString s, int st, int w, int t);



    QString getName() const;

    int getNWin() const;

    int getNStep() const;

    int getCurrentState() const;

signals:

public slots:

private:
    QString name; //имя шахматной фигуры
    int nWin; //количество срубленных фигур
    int nStep; //количество ходов
    int idFigure; //номер фигуры
    int currentState;
};

#endif // FIGURE_H
figure.cpp
#include "figure.h"

Figure::Figure()
{

}

Figure::Figure(QString s, int st, int w, int t) : name(s), currentState(st), nWin(w), nStep(t)
{

}

QString Figure::getName() const
{
    return name;
}

int Figure::getNWin() const
{
    return nWin;
}

int Figure::getNStep() const
{
    return nStep;
}

int Figure::getCurrentState() const
{
    return currentState;
}
mytablemodel.h
#ifndef MYTABLEMODEL_H
#define MYTABLEMODEL_H

#include <QObject>
#include <QAbstractTableModel>
#include <QVariant>
#include <QVector>

#include "figure.h"

class MyTableModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    explicit MyTableModel(QObject *parent = 0);
    //данные
    QVariant data(const QModelIndex &index, int role) const;
    //число строк
    int rowCount(const QModelIndex &parent=QModelIndex()) const;
    //число столбцов
    int columnCount(const QModelIndex &parent) const;
    //
    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
    //добавление строки
    bool insertRows(int row, int count, const QModelIndex &parent);

signals:

public slots:
    void slotNewRow(Figure *curF);
    void slotUpdate();

private:
    QStringList m_header_data; //заголовки таблицы
    QVector <Figure*> listFigure;
};

#endif // MYTABLEMODEL_H
mytablemodel.cpp
#include "mytablemodel.h"

MyTableModel::MyTableModel(QObject *parent) : QAbstractTableModel(parent)
{
    //инициализация заголовков
    m_header_data << "Имя" << "Состояние" << "Количество взятий" << "Количество ходов";
}
QVariant MyTableModel::data(const QModelIndex &index, int role) const
{
    //представление данных в таблице

    //если индекс недействителен, возращаем пустой вариант
    if (!index.isValid())
        return QVariant();
    int row = index.row();
    if (row >= listFigure.size())
        return QVariant();


    //выясняем какой столбец
    switch (index.column())
    {

    case 0: //столбец с именем
    {

        return listFigure[row]->getName();
    }
    case 1:
    {//столбец состояния
        Figure *cur = listFigure[row];
        if (cur->getCurrentState() == 1)
        {
            return QString("ЖИВ");
        }
        else if (cur->getCurrentState() == 2)
        {
            return QString("МЕРТВ");
        }
        else
        {
            return QString("Ожидание");
        }
    }
    case 2: //столбец с числом атак
        return QString::number(listFigure[row]->getNWin());
    case 3: //столбец с числом ходов
        return QString::number(listFigure[row]->getNStep());

    }
}

int MyTableModel::rowCount(const QModelIndex &parent) const
{
    return listFigure.size();
}

int MyTableModel::columnCount(const QModelIndex &parent) const
{
    return m_header_data.size();
}

QVariant MyTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    // для заголовков
    if(role != Qt::DisplayRole) return QVariant();
    if (orientation == Qt::Horizontal)
    {
        return m_header_data.at(section);
    }
    else
    {
        return QString().setNum(section);
    }
}

bool MyTableModel::insertRows(int row, int count, const QModelIndex &parent)
{
    Q_UNUSED(parent);
    beginInsertRows(QModelIndex(), row, row+count-1);
    Figure *tempF = new Figure();
    listFigure.insert(row,count,tempF);
    endInsertRows();
    return true;
}
void MyTableModel::slotNewRow(Figure *curF)
{
    insertRows(rowCount(), 1, QModelIndex());//вставляем в конец
    //int xex = rowCount();
    rowCount();
    //beginInsertRows();
    listFigure[rowCount()-1] = curF;
}

void MyTableModel::slotUpdate()
{
    emit(dataChanged(QModelIndex(), QModelIndex()));
}
ChessTableView.7z
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

1
Evgenii Legotckoi
  • Жел. 12, 2017, 1:17 Т.Қ.

Вы возвращаете значения абсолютно для всех ролей в модели, а нужно возвращать значения только для DisplayRole, для других ролей, если не определено, нужно возвращать невалидный QVariant.


Вот исправленный метод data
QVariant MyTableModel::data(const QModelIndex &index, int role) const
{
    //представление данных в таблице

    //если индекс недействителен, возращаем пустой вариант
    if (!index.isValid())
        return QVariant();
    int row = index.row();
    if (row >= listFigure.size())
        return QVariant();

    if (role == Qt::DisplayRole)
    {
        //выясняем какой столбец
        switch (index.column())
        {

        case 0: //столбец с именем
        {

            return listFigure[row]->getName();
        }
        case 1:
        {//столбец состояния
            Figure *cur = listFigure[row];
            if (cur->getCurrentState() == 1)
            {
                return QString("ЖИВ");
            }
            else if (cur->getCurrentState() == 2)
            {
                return QString("МЕРТВ");
            }
            else
            {
                return QString("Ожидание");
            }
        }
        case 2: //столбец с числом атак
            return QString::number(listFigure[row]->getNWin());
        case 3: //столбец с числом ходов
            return QString::number(listFigure[row]->getNStep());

        }
    }
    return QVariant();
}

    Пікірлер

    Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
    Кіріңіз немесе Тіркеліңіз
    Г

    C++ - Тест 001. Первая программа и типы данных

    • Нәтиже:66ұпай,
    • Бағалау ұпайлары-1
    t

    C++ - Тест 001. Первая программа и типы данных

    • Нәтиже:33ұпай,
    • Бағалау ұпайлары-10
    t

    Qt - Тест 001. Сигналы и слоты

    • Нәтиже:52ұпай,
    • Бағалау ұпайлары-4
    Соңғы пікірлер
    G
    GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
    Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
    d
    dblas5Шілде 5, 2024, 11:02 Т.Ж.
    QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
    k
    kmssrАқп. 8, 2024, 6:43 Т.Қ.
    Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
    АК
    Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
    Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
    Енді форумда талқылаңыз
    Evgenii Legotckoi
    Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
    добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
    F
    FynjyШілде 22, 2024, 4:15 Т.Ж.
    при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
    BlinCT
    BlinCTМаусым 25, 2024, 1 Т.Ж.
    Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
    BlinCT
    BlinCTМамыр 5, 2024, 5:46 Т.Ж.
    Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
    Evgenii Legotckoi
    Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
    Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

    Бізді әлеуметтік желілерде бақылаңыз