Отображение нескольких значков в одной ячейке QTableView - PullRequest
2 голосов
/ 07 декабря 2009

Я пишу небольшое графическое приложение с QT4.5 в QtCreator.

Главный экран приложения содержит QTreeView с двумя столбцами, первый - текст, второй - группа значков. Эти значки представляют последние несколько состояний элемента, отображаемого в строке.

Я не уверен, что лучший способ сделать это. В настоящее время я реализовал это путем генерации QPixmap метода data() модели.

QVariant MyModel::data(const QModelIndex &index, int role) const
{
    if (role == Qt::DisplayRole || role == Qt::EditRole) {
        switch(index.column()) {
            case 0:
                return item_.at(index.row()).title();
        }
    }
    if (role == Qt::DecorationRole) {
        switch(index.column()) {
            case 1:
                return makeImage(item_.add(index.row()).lastStates());
        }
    }

    return QVariant();
}

QVariant MyModel::makeImage(const QList<MyState> &states) const
{
    const int IconSize = 22;
    QPixmap image(IconSize * states.size(), IconSize);
    QPainter painter(&image);

    painter.fillRect(0, 0, IconSize * count, IconSize, Qt::transparent);
    for (int i = 0; i < states.size(); ++i) {
        QIcon * icon = stateIcon(state.at(i));
        icon->paint(&painter, IconSize * i, 0, IconSize, IconSize);
    }
    return image;
}

Это работает, но для некоторых небольших проблем фон, который должен быть прозрачным, полон случайного шума, даже заполнение его прозрачным цветом не исправляет это.

Во-вторых, это не кажется очень эффективным, я генерирую новое изображение каждый раз, когда это вызывается, я должен не просто рисовать значки на виджете для ячейки?

Каков наилучший способ отображения нескольких значков в одной ячейке?

1 Ответ

6 голосов
/ 07 декабря 2009

Я бы создал пользовательский делегат на основе hbox, в который вы можете поместить все картинки. Взгляните на делегатов в документации Qt о программировании вида модели .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...