m
mihenze12. Dezember 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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

1
Evgenii Legotckoi
  • 12. Dezember 2017 13: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();
}

    Kommentare

    Nur autorisierte Benutzer können Kommentare posten.
    Bitte Anmelden oder Registrieren
    Letzte Kommentare
    A
    ALO1ZE19. Oktober 2024 08:19
    Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
    ИМ
    Игорь Максимов5. Oktober 2024 07:51
    Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
    d
    dblas55. Juli 2024 11:02
    QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
    k
    kmssr8. Februar 2024 18:43
    Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
    Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
    Jetzt im Forum diskutieren
    J
    JacobFib17. Oktober 2024 03:27
    добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
    JW
    Jhon Wick1. Oktober 2024 15:52
    Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
    КГ
    Кирилл Гусарев27. September 2024 09:09
    Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
    F
    Fynjy22. Juli 2024 04:15
    при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

    Folgen Sie uns in sozialen Netzwerken