1

QListViewに問題があり、QListViewの左上に意図しないアイテムがペイントされます。

http://s4.postimage.org/64orbk5kd/Screen_Shot_2013_02_14_at_20_23_14.png

QListViewでQStyledItemDelegateを使用しています:

m_stringList.push_back("FIRST");
m_stringList.push_back("SECOND");
m_stringList.push_back("THIRD");
m_model.setStringList(m_stringList);

ui->processesListView->setFlow(QListView::LeftToRight);
ui->processesListView->setModel(&m_model);
ui->processesListView->setItemDelegate(new ProcessItemDelegate(this, ui->processesListView));

デリゲート(ProcessItemDelegate)ペイントメソッドは、カスタムQWidgetを使用して情報を表示します。

void ProcessItemDelegate::paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex &inIndex ) const
{
  _listItem->setContent(_listView->model()->data(inIndex).toString());
  painter->save();
  painter->translate(option.rect.center());
  _listItem->render(painter);
  painter->restore();
}

QWidgetのsetContentメソッドは非常に単純です:

void ProcessItem::setContent(const QString &s)
{
  ui->processId->setText(s);
}
4

1 に答える 1

1

を使用してウィジェットをリストに追加する別の方法がありますQListWidget

たとえば、それui->historyViewがのQListWidget要素でHistoryElementViewありサブクラスであることを知っていQWidgetます。

void View::onHistoryChanged(const QList<HistoryElement> &history)
{
    clearHistory();
    foreach(HistoryElement elt, history)
    {
        HistoryElementView *historyViewElement = new HistoryElementView(elt.getDateTime("dd/MM/yyyy - hh:mm"), elt.getFilename());
        QListWidgetItem *item = new QListWidgetItem();

        ui->historyView->addItem(item);
        ui->historyView->setItemWidget(item, historyViewElement);
    }
}

void View::clearHistory()
{
    QListWidgetItem *item;

    while (ui->historyView->count() != 0)
    {
         item = ui->historyView->takeItem(0);

        delete item;
    }
}

内のウィジェットを削除する必要はありませんQListWidgetItem。Qtによって処理されます。

ウィジェットがリスト内に入ると、次を使用してウィジェットを取得できます。

// Using index
QListWidgetItem *item = ui->historyView->item(0);
HistoryElementView *elt = qobject_cast<HistoryElementView *>(ui->historyView->itemWidget(item));

// Using position
QListWidgetItem *item = ui->historyView->itemAt(pos);
HistoryElementView *historyElement = qobject_cast<HistoryElementView *>(ui->historyView->itemWidget(item));

それが役に立てば幸い。

于 2013-02-15T08:21:47.567 に答える