m
mihenze12 декабря 2017 г. 22: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
  • 13 декабря 2017 г. 0: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();
}

    Комментарии

    Только авторизованные пользователи могут публиковать комментарии.
    Пожалуйста, авторизуйтесь или зарегистрируйтесь
    Ua

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

    • Результат:84баллов,
    • Очки рейтинга4
    Ua

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

    • Результат:42баллов,
    • Очки рейтинга-8
    ОК

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

    • Результат:47баллов,
    • Очки рейтинга-6
    Последние комментарии
    ИМ
    Игорь Максимов22 ноября 2024 г. 21:51
    Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
    Evgenii Legotckoi
    Evgenii Legotckoi31 октября 2024 г. 23:37
    Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
    A
    ALO1ZE19 октября 2024 г. 17:19
    Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
    ИМ
    Игорь Максимов5 октября 2024 г. 16:51
    Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
    d
    dblas55 июля 2024 г. 20:02
    QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
    Сейчас обсуждают на форуме
    f
    firstlunoxod15 февраля 2025 г. 13:46
    Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
    Дмитрий
    Дмитрий3 февраля 2025 г. 16:24
    Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
    NW
    Nayo Wai30 января 2025 г. 19:22
    не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
    n
    nkly3 января 2025 г. 12:52
    Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
    M
    Marsel17 августа 2023 г. 0:26
    OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

    Следите за нами в социальных сетях