リスト項目をどのように表示するかを正確に見なくても「ベスト」ソリューションを提案するのは少し難しいですが、試してみましょう。
実際にQtスレッドhereには素晴らしい記事があります。最終的に最後には、それらがトップに表示されるようなリストの種類を作成するために使用するすべてのコードが提供されます。
基本的に、各アイテムには大きなアイコンがあり、右側にはタイトルと説明テキストがあり、それぞれのスタイルはそれぞれ異なります。
カスタムデリゲートを作成するのは怖いですが、基本的にはリストのカスタムウィジェットを提供するだけです。基本的にテンプレートのように機能します。あなたは、あなたのリスト項目を見せたいものを定義し、それをリストからのデータを使ってペイントします。 QAbstractItemDelegateから継承できます。
#include <QPainter>
#include <QAbstractItemDelegate>
class ListDelegate : public QAbstractItemDelegate
{
public:
ListDelegate(QObject *parent = 0);
void paint (QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const;
QSize sizeHint (const QStyleOptionViewItem & option, const QModelIndex & index) const;
virtual ~ListDelegate();
};
最も大きな仕事は、ペイント機能をコーディングすることです。ここでは基本について説明しますが、長い例については上のリンクを参照できます。
ListDelegate::ListDelegate(QObject *parent)
: QAbstractItemDelegate(parent)
{
}
void ListDelegate::paint (QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
{
QRect r = option.rect;
QPen fontPen(QColor::fromRgb(51,51,51), 1, Qt::SolidLine);
if(option.state & QStyle::State_Selected)
{
painter->setBrush(Qt::cyan);
painter->drawRect(r);
}
else
{
//BACKGROUND ALTERNATING COLORS
painter->setBrush((index.row() % 2) ? Qt::white : QColor(252,252,252));
painter->drawRect(r);
}
painter->setPen(fontPen);
//GET TITLE, DESCRIPTION AND ICON
QIcon ic = QIcon(qvariant_cast<QPixmap>(index.data(Qt::DecorationRole)));
QString title = index.data(Qt::DisplayRole).toString();
QString description = index.data(Qt::UserRole).toString();
int imageSpace = 10;
if (!ic.isNull())
{
//ICON
r = option.rect.adjusted(5, 10, -10, -10);
ic.paint(painter, r, Qt::AlignVCenter|Qt::AlignLeft);
imageSpace = 55;
}
//TITLE
r = option.rect.adjusted(imageSpace, 0, -10, -30);
painter->setFont(QFont("Lucida Grande", 6, QFont::Normal));
painter->drawText(r.left(), r.top(), r.width(), r.height(), Qt::AlignBottom|Qt::AlignLeft, title, &r);
//DESCRIPTION
r = option.rect.adjusted(imageSpace, 30, -10, 0);
painter->setFont(QFont("Lucida Grande", 5, QFont::Normal));
painter->drawText(r.left(), r.top(), r.width(), r.height(), Qt::AlignLeft, description, &r);
}
QSize ListDelegate::sizeHint (const QStyleOptionViewItem & option, const QModelIndex & index) const
{
return QSize(200, 60); // very dumb value
}
ListDelegate::~ListDelegate()
{
}
このコードでは、リストから3ビットのデータを取得しています。アイコン、タイトル、および説明。次に、アイコンの描画を表示し、2つのテキスト文字列を描画します。しかし、重要な部分はデータそのものを取得することです。基本的には、私たちに渡された「インデックス」を使ってデータを提供するようにリストに求めています。
QIcon ic = QIcon(qvariant_cast<QPixmap>(index.data(Qt::DecorationRole)));
QString title = index.data(Qt::DisplayRole).toString();
QString description = index.data(Qt::UserRole + 1).toString();
情報の各ビットが異なる「役割」を使用して取得されていることがわかります。通常、リストには表示されるものが1つしかありません。これはDisplayRoleでアクセスされます。アイコンはDecorationRoleに格納されます。しかし、より多くのものを保存したい場合は、UserRoleの使用を開始します。 UserRole、UserRole +1、UserRole +2などを使用して、たくさんのものを保存することができます。
どのようにこれらの情報を各アイテムに保存しますか?簡単...
最後に、あなたの気の利いた新しいデリゲートを使ってリストにアイテムを表示させるにはどうすればよいですか?
myListWidget->setItemDelegate(new ListDelegate(myListWidget));
これが少しわかりました。
私は今夜、あなたの時間とあなたの応答の明快さに非常に感謝します。 – wnkz
ご返信ありがとうございます。私はそれを試しましたが、私はまだ問題があります.C++関連、未定義のシンボル、おそらくあなたは[github](https://github.com/wnkz/LessCC)のコードを見ることができますか? – wnkz
エラーは何ですか? – Liz