Qt: QListView с QAbstractItemModel и QStyledItemDelegate занимает много времени для добавления элементов

У меня есть qt-приложение с QListView, пользовательская модель и класс, унаследованный от QStyledItemDelegate показать пользовательские предметы. К сожалению, на добавление примерно 6000 предметов уходит много времени (5 секунд). У вас есть подсказка / решение для моей проблемы?

Ниже вы видите мою реализацию:

Модель:

class AddressItemData : public QObject {
Q_OBJECT

public:
AddressItemData (QObject * parent = 0) : QObject(parent) {}

QString address;
QString name;
bool inserted;
};

class AddressModel : public QAbstractListModel
{
Q_OBJECT
public:
AddressModel (QObject *parent = 0);

int rowCount(const QModelIndex &parent = QModelIndex()) const {
return addressItems.count();
}

QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const {
if (!index.isValid())
return QVariant();

if (index.row() >= addressItems.size() || index.row() < 0)
return QVariant();

if (Qt::DisplayRole == role) {
return QVariant::fromValue<AddressItemData*>(addressItems.at(index.row()));
}

return QVariant();
}

void addAddressItem(AddressItemData* addressItem){
beginInsertRows(QModelIndex(), rowCount(), rowCount());
addressItems.append(addressItem);
endInsertRows();
}

void addAddressItems(QList<AddressItemData*> addressItems){
beginInsertRows(QModelIndex(), rowCount(), rowCount() + addressItems.size() - 1);
this->addressItems.append(addressItems);
endInsertRows();
}

void removeAddressItem(AddressItemData* addressItem);

void deleteAllAddressItems(void){
beginRemoveRows(QModelIndex(), rowCount(), rowCount());
for (int i = 0; i < addressItems.size(); ++i) {
delete addressItems.at(i);
}
addressItems.clear();
endRemoveRows();
}private:
QList<AddressItemData*> addressItems;

};

Для модели я создал собственный метод добавления и удаления, который будет вызываться из делегата.

ItemViewDelegate:

class AddressViewDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
AddressViewDelegate (QWidget *parent = 0) : QStyledItemDelegate(parent) {}

void paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const {

if(!index.isValid())
return;

painter->save();

QStyleOptionViewItemV4 opt = option;

if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());

QRect addressRect = opt.rect;

AddressItemData* d = index.data().value<AddressItemData*>();

painter->setPen(Qt::black);
painter->drawText(QRect(addressRect.left(), addressRect.top(),  addressRect.width(), addressRect.height()/2),
opt.displayAlignment,  d->address);
}

QSize sizeHint(const QStyleOptionViewItem &option,
const QModelIndex &index) const {
if(!index.isValid())
return QSize();

QSize result = QStyledItemDelegate::sizeHint(option, index);
result.setHeight(result.height()*2);

return result;
}
};

В целях тестирования приложение отображает только адрес. Я хочу показать также другую информацию рядом с адресом в одной строке. Позже я также хочу добавить сигнал / слот-поведение для каждой строки, но это еще далеко.

Главный:

AddressModel* model = new AddressModel;
AddressViewDelegate* viewDelegate = new AddressViewDelegate;
ui->listView->setItemDelegate(viewDelegate);
ui->listView->setModel(model);
ui->listView->setUniformItemSizes(true);
ui->listView->setLayoutMode(QListView::Batched);

QList<AddressItemData *> addressItems;
... for loop to add AddressItemData:
AddressItemData* data = new AddressItemData;
data->address = anotherTable.at(index);
addressItems.append(data);
// ...

model->addAddressItems(addressItems);

в main, Я звоню addAddressItems но также с одним вариантом вызова это медленно. Я надеюсь, что мой код достаточно ясен, и я могу помочь другим.

У вас есть идея, почему процедура добавления так медленно?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]