2011-08-01 44 views
3

私は本当に単純なQListWidgetオブジェクトを持っていて、フォルダリストを作成したいと思います。 私はここに私のリストに項目を追加し、私が何をすべきかです:Qt QListWidgetItem複数行

void LessCC::on_addFolderButton_clicked() 
{ 
    QString dirName = QFileDialog::getExistingDirectory(this, tr("Choose Directory"), QDir::homePath(), QFileDialog::ShowDirsOnly); 
    QListWidgetItem* newItem = new QListWidgetItem(QIcon(":/resources/icons/folder.png"), dirName, 0, 0); 
    this->ui->folderListWidget->addItem(newItem); 
} 

これが働いているが、私は私の項目が複数の行または(異なるスタイルで)情報の列を持っていると思います。

は、私が見つけた他のすべてのソリューションは、このような簡単な(?)事のために、本当に複雑なようですので、私は本当にそれがどのように動作するか理解していないQStyledItemDelegate しかしについて聞きました。

これはの解決策ですか、それとも私が見ていないもっと単純なものがありますか?

誰かが私を助けることを願っています。

答えて

10

リスト項目をどのように表示するかを正確に見なくても「ベスト」ソリューションを提案するのは少し難しいですが、試してみましょう。

実際に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)); 

これが少しわかりました。

+0

私は今夜、あなたの時間とあなたの応答の明快さに非常に感謝します。 – wnkz

+0

ご返信ありがとうございます。私はそれを試しましたが、私はまだ問題があります.C++関連、未定義のシンボル、おそらくあなたは[github](https://github.com/wnkz/LessCC)のコードを見ることができますか? – wnkz

+0

エラーは何ですか? – Liz