Название: Не вызывается метод headerData() (и возможно еще некоторые)
Отправлено: 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; };
Вот скриншот приложил для большего понимания: (http://s017.radikal.ru/i403/1612/7c/313f41e93e22.png) (http://radikal.ru) Залил весь проект на mail.облако. Если кому не лень, посмотрите :) Вот ссылка: https://cloud.mail.ru/public/H9Ut/1UQSLiNV7 (https://cloud.mail.ru/public/H9Ut/1UQSLiNV7)
Название: Re: Не вызывается метод headerData() (и возможно еще некоторые)
Отправлено: GreatSnake от Декабрь 15, 2016, 16:30
Судя по картинке на view спрятан header(). И через модель исправить это не получится.
Название: Re: Не вызывается метод headerData() (и возможно еще некоторые)
Отправлено: lit-uriy от Декабрь 16, 2016, 11:34
а что значит не вызывается? Программа при вызове этого метода падает?
Название: Re: Не вызывается метод headerData() (и возможно еще некоторые)
Отправлено: Wizzy от Декабрь 16, 2016, 14:21
Судя по картинке на view спрятан header(). И через модель исправить это не получится.
Да, действительно. Оказались правы. Использовал следующий код и header вернулся: ui->writeValueTable->setHeaderHidden(false);
Вопрос тогда такой, почему он невидим изначально?
Название: Re: Не вызывается метод headerData() (и возможно еще некоторые)
Отправлено: Wizzy от Декабрь 16, 2016, 14:22
а что значит не вызывается? Программа при вызове этого метода падает?
Я неправильно выразился. Просто я не видел никакой реакции на вызов этого метода и решил, что с ним проблема. Оказалось, как написал человек выше, что header был просто невидим, но я так и не понял почему.
Название: Re: Не вызывается метод headerData() (и возможно еще некоторые)
Отправлено: GreatSnake от Декабрь 16, 2016, 14:29
Вопрос тогда такой, почему он невидим изначально?
Потому что в designer-e его кто-то отключил.
|