Указанных в предыдущей статье описаний для хорошей жизни явно недостаточно. Довольно часто бывает необходимо задать заголовки столбцов, или сделать строки уникального (другого) цвета. Данные вопросы я и поведаю в данной статье.
Итак, для того чтобы возвращать заголовок таблицы, необходимо переопределить в модели метод headerData. Вот пример из моего архива:
Соответственно, если вам надо заголовок по вертикали, проверяете (orientation == Qt::Vertical).
Следующая возможная задача - задавать различные цвета для различных строк. Эта возможность задаётся в методе data. Расширим данную функцию для предыдущего примера так, чтобы таблица на выходе имела поочередно красные и синие строки:
Итак, для того чтобы возвращать заголовок таблицы, необходимо переопределить в модели метод headerData. Вот пример из моего архива:
QVariant ItemsModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role != Qt::DisplayRole)
return QVariant();
if (orientation == Qt::Horizontal)
{
switch (section)
{
case 0:
return QVariant(QString::fromUtf8("Название"));
case 1:
return QVariant(QString::fromUtf8("Заводской номер"));
case 2:
return QVariant(QString::fromUtf8("R2, м"));
case 3:
return QVariant(QString::fromUtf8("Rкз, м"));
case 4:
return QVariant(QString::fromUtf8("Предписание"));
case 5:
return QVariant(QString::fromUtf8("Заключение"));
case 6:
return QVariant(QString::fromUtf8("Примечание"));
default:
return QVariant();
}
}
return QVariant();
}
Соответственно, если вам надо заголовок по вертикали, проверяете (orientation == Qt::Vertical).
Следующая возможная задача - задавать различные цвета для различных строк. Эта возможность задаётся в методе data. Расширим данную функцию для предыдущего примера так, чтобы таблица на выходе имела поочередно красные и синие строки:
QVariant myTableModel::data(const QModelIndex &index, int role) const
{
if (role == Qt::DisplayRole) {
QString unswer = QString("row = ") + QString::number(index.row()) + " col = " + QString::number(index.column());
// строкой выше мы формируем ответ. QString::number преобразует число в текст
return QVariant(unswer);
}
else if (role == Qt::BackgroundColorRole)
{
if (index.row() % 2)
return Qt::red;
else return Qt::blue;
}
return QVariant();
}
И вуаля:
Цвета вырви глаз, конечно, но статья полезная:)
ОтветитьУдалитьОффтопик. Не доводилось ли вам встречаться с ошибками линкера типа 'unresolved external symbol ...::metaObject...', либо 'qt_metacast', 'qt_metacall'? (Пример внизу.) Вроде бы ошибка достаточно распространенная, но распространенные решения мне же и не помогают. Более-менее понятно, что это связано с тем, что у меня не формируется moc_*.cpp для какого-то класса с Q_OBJECT, но внятного описания причин и следствий на серьезном низком уровне я не нашел. У вас есть какие-то соображения или источники на эту тему?
unresolved external symbol "public: virtual struct QMetaObject const * __thiscall GuiReceiver::metaObject(void)const " (?metaObject@GuiReceiver@@UBEPBUQMetaObject@@XZ)
Вполне возможно что и говорит. Смею предположить что какай-то слот объявлен, но не определен... А вообще без исходников судить тяжковато...
ОтветитьУдалитьА почему не исползовать для этого стандартную функцию? Типа:
ОтветитьУдалитьmodel = new QSqlTableModel(...);
model->setHeaderData( 2 , Qt :: Horizontal , tr( "Число" ));
где 2 - номер колонки