понедельник, 22 октября 2012 г.

Создание модели на базе QAbstractTableModel для QTableView, дополнение

Указанных в предыдущей статье описаний для хорошей жизни явно недостаточно. Довольно часто бывает необходимо задать заголовки столбцов, или сделать строки уникального (другого) цвета. Данные вопросы я и поведаю в данной статье.

Итак, для того чтобы возвращать заголовок таблицы, необходимо переопределить в модели метод 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();
}
И вуаля: 









3 комментария:

  1. Цвета вырви глаз, конечно, но статья полезная:)

    Оффтопик. Не доводилось ли вам встречаться с ошибками линкера типа '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)

    ОтветитьУдалить
  2. Вполне возможно что и говорит. Смею предположить что какай-то слот объявлен, но не определен... А вообще без исходников судить тяжковато...

    ОтветитьУдалить
  3. А почему не исползовать для этого стандартную функцию? Типа:
    model = new QSqlTableModel(...);
    model->setHeaderData( 2 , Qt :: Horizontal , tr( "Число" ));
    где 2 - номер колонки

    ОтветитьУдалить