Russian Qt Forum
Май 17, 2024, 03:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не вызывается метод headerData() (и возможно еще некоторые)  (Прочитано 4096 раз)
Wizzy
Гость
« : Декабрь 15, 2016, 12:48 »

Здравствуйте, господа!
Такой вопрос, я решил переделать под свои нужды для микроконтроллера проект из примера (конкретно Qt Modbus Master).
Но тут заметил, что метод почему-то не вызывается..Почему?

p.s. Если как-то неправильно задал вопрос, то уточню, просто не понимаю причины проблемы. Хотел бы развернутый ответ или, желательно даже, в ЛС Улыбающийся

Листинг самого класса:
Код:
#include "writeregistermodel.h"

enum { NumColumn = 0, CoilsColumn = 1, ColumnCount = 2, RowCount = 8 };

WriteRegisterModel::WriteRegisterModel(QObject *parent)
    : QAbstractTableModel(parent),
      m_coils(RowCount, false)
{
}

int WriteRegisterModel::rowCount(const QModelIndex &/*parent*/) const
{
    return RowCount;
}

int WriteRegisterModel::columnCount(const QModelIndex &/*parent*/) const
{
    return ColumnCount;
}

QVariant WriteRegisterModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid() || index.row() >= RowCount || index.column() >= ColumnCount)
        return QVariant();

    Q_ASSERT(m_coils.count() == RowCount);

    if (index.column() == NumColumn && role == Qt::DisplayRole)
        return QString::number(index.row());

    if (index.column() == CoilsColumn && role == Qt::CheckStateRole) // coils
        return m_coils.at(index.row()) ? Qt::Checked : Qt::Unchecked;

    return QVariant();

}

QVariant WriteRegisterModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (role != Qt::DisplayRole)
        return QVariant();

    if (orientation == Qt::Horizontal) {
        switch (section) {
        case NumColumn:
            return QStringLiteral("#");
        case CoilsColumn:
            return QStringLiteral("Coils  ");
        default:
            break;
        }
    }
    return QVariant();
}

bool WriteRegisterModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (!index.isValid() ||  index.row() >= RowCount || index.column() >= ColumnCount)
        return false;

    Q_ASSERT(m_coils.count() == RowCount);

    if (index.column() == CoilsColumn && role == Qt::CheckStateRole) { // coils
        auto s = static_cast<Qt::CheckState>(value.toUInt());
        s == Qt::Checked ? m_coils.setBit(index.row()) : m_coils.clearBit(index.row());
        emit dataChanged(index, index);
        return true;
    }
    return false;
}

Qt::ItemFlags WriteRegisterModel::flags(const QModelIndex &index) const
{
    if (!index.isValid() || index.row() >= RowCount || index.column() >= ColumnCount)
        return QAbstractTableModel::flags(index);

    Qt::ItemFlags flags = QAbstractTableModel::flags(index);
    if ((index.row() < m_address) || (index.row() >= (m_address + m_number)))
        flags &= ~Qt::ItemIsEnabled;

    if (index.column() == CoilsColumn) //coils
        return flags | Qt::ItemIsUserCheckable;

    return flags;
}

void WriteRegisterModel::setStartAddress(int address)
{
    m_address = address;
    emit updateViewport();
}

void WriteRegisterModel::setNumberOfValues(const QString &number)
{
    m_number = number.toInt();
    emit updateViewport();
}


в mainwindow.cpp же только вот эта строка:
Код:
 writeModel = new WriteRegisterModel(this);

В заголовочном (mainwindow.h.) все же есть:
Код:
private:
    Ui::MainWindow *ui;
    QModbusReply *lastRequest;
    QModbusClient *modbusDevice;
    SettingsDialog *m_settingsDialog;
    WriteRegisterModel *writeModel;
};


Вот скриншот приложил для большего понимания:




Залил весь проект на mail.облако. Если кому не лень, посмотрите Улыбающийся  Вот ссылка: https://cloud.mail.ru/public/H9Ut/1UQSLiNV7
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Декабрь 15, 2016, 16:30 »

Судя по картинке на view спрятан header().
И через модель исправить это не получится.
Записан

Qt 5.11/4.8.7 (X11/Win)
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Декабрь 16, 2016, 11:34 »

а что значит не вызывается? Программа при вызове этого метода падает?
Записан

Юра.
Wizzy
Гость
« Ответ #3 : Декабрь 16, 2016, 14:21 »

Судя по картинке на view спрятан header().
И через модель исправить это не получится.

Да, действительно. Оказались правы. Использовал следующий код и header вернулся:
Код:
ui->writeValueTable->setHeaderHidden(false);
Вопрос тогда такой, почему он невидим изначально?
Записан
Wizzy
Гость
« Ответ #4 : Декабрь 16, 2016, 14:22 »

а что значит не вызывается? Программа при вызове этого метода падает?
Я неправильно выразился. Просто я не видел никакой реакции на вызов этого метода и решил, что с ним проблема. Оказалось, как написал человек выше, что header был просто невидим, но я так и не понял почему.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Декабрь 16, 2016, 14:29 »

Вопрос тогда такой, почему он невидим изначально?
Потому что в designer-e его кто-то отключил.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 23.