4

だから私が欲しいのは、選択可能なウィジェットを表示するqlistviewです(ボタンの画像とテキストを表示するラベル(ウィジェットはaとaの水平レイアウトを持つqwidgetベースのウィジェットですQLabelQPushButton)。モデルは、各アイテムの画像パスとボタン テキストを保存する必要があります (これは問題ではないようです)。QListView 派生ウィジェットを正常に作成しましたが、最初のリスト項目 (カスタム ウィジェット) しか表示されず、選択できません。カスタム モデル、ビュー、およびデリゲートを作成しましたが、最初だけでなく、すべてのリスト アイテムにウィジェットを表示する方法がわかりません。完全なソースコードのリンクは次のとおりです: SOURCE CODE LINK

5 つのウィジェット アイテムのリストと 1 つのウィジェット アイテムのリストを別々にアプリケーションを実行しました。そして、ウィジェットを追加すると思いますが、最初のウィジェットでそれらすべてが重なっています(5つのアイテムのビルドでは、ボタンに濃い影があります):

リストにある 5 つのウィジェット: ループで定義された 5 つのウィジェット アイテムを使用してコンパイルおよび実行されたウィジェット

リスト内の 1 つのウィジェット: ループで定義された 1 つのウィジェット アイテムを使用してコンパイルおよび実行されたウィジェット

ご覧のとおり、影に違いがあります。

コードの別のコピーを次に示します。

Delegate.h のコードは次のdelegateとおりです。

#include <QtGui>
#include <QAbstractItemDelegate>

class WidgetDelegate : public QAbstractItemDelegate
{
public:
    WidgetDelegate(QObject *parent = 0);

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

    QSize sizeHint(const QStyleOptionViewItem &option,
                  const QModelIndex &index) const;

};

デリゲート.cpp

#include <QtGui>

#include "Delegate.h"
#include "Profile.h"

WidgetDelegate::WidgetDelegate(QObject *parent)
    : QAbstractItemDelegate(parent)
{ }

void WidgetDelegate::paint(QPainter */*painter*/,
                           const QStyleOptionViewItem &/*option*/,
                           const QModelIndex &/*index*/) const
{
}

QSize WidgetDelegate::sizeHint(const QStyleOptionViewItem &/*option*/,
                              const QModelIndex &/*index*/) const
{
    return QSize(ProfileItem().geometry().width(), ProfileItem().geometry().height());
}

Model.h

#ifndef MODEL_H
#define MODEL_H

#include <QStringList>
#include <QAbstractListModel>
#include <QList>
#include "Profile.h"

class StringListModel : public QAbstractListModel
{
    Q_OBJECT

public:
    StringListModel(const QStringList &strings, QObject *parent = 0)
        : QAbstractListModel(parent), stringList(strings) {}

    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    QVariant data(const QModelIndex &index, int role) const;
    QVariant headerData(int section, Qt::Orientation orientation,
                        int role = Qt::DisplayRole) const;

private:
    QStringList stringList;
};

#endif // MODEL_H

モデル.cpp

#include "Model.h"
#include <QVariant>

int StringListModel::rowCount(const QModelIndex &/*parent*/) const
{
    return stringList.count();
}

QVariant StringListModel::data(const QModelIndex &/*index*/,
                               int /*role*/) const
{
}

QVariant StringListModel::headerData(int /*section*/,
                                     Qt::Orientation /*orientation*/,
                                     int /*role*/) const
{
}

リスト ビューを含む Prefs.h ウィジェット:

#ifndef PREFERENCES_H
#define PREFERENCES_H

#include "Model.h"
#include <QDialog>

class QPushButton;
class ProfileItem;
class QVBoxLayout;
class View;
class StringListModel;

class Preferences : public QDialog
{
public:
    Preferences(QWidget *parent = 0);

private:
    QVBoxLayout *m_pVerticalLayout;

    View *myList;
    QPushButton *button;
    ProfileItem *item;
    StringListModel *customModel;
};

#endif // PREFERENCES_H

Prefs.cpp

#include "Profile.h"

#include <QPixmap>
#include <QHBoxLayout>
#include <QBitmap>
#include <QMessageBox>

ProfileItem::ProfileItem(QWidget *parent) :
    QWidget(parent)
{
    pixmap = QPixmap(":/avatar");

    m_avatarImageLabel.setPixmap(pixmap);
    m_avatarImageLabel.setMask(pixmap.mask());
    m_avatarTextButton.setText("Test");
    connect(&m_avatarTextButton, SIGNAL(clicked()), this, SLOT(buttonPushed()));

    m_pHorizontalLayout = new QHBoxLayout;

    m_pHorizontalLayout->addWidget(&m_avatarImageLabel);
    m_pHorizontalLayout->addWidget(&m_avatarTextButton);

    setLayout(m_pHorizontalLayout);
}

void ProfileItem::setAvatarImage(const QString &avatarImage)
{
    pixmap = QPixmap(avatarImage);
    m_avatarImageLabel.setPixmap(pixmap);
    m_avatarImageLabel.setMask(pixmap.mask());
}

void ProfileItem::setAvatarName(const QString &avatarName)
{
    m_avatarTextButton.setText(avatarName);
}

void ProfileItem::buttonPushed()
{
    QMessageBox msg;
    msg.setText("Button was pushed!");
    msg.exec();
}

リスト項目として使用する必要がある Profile.h ウィジェット

#ifndef PROFILEITEM_H
#define PROFILEITEM_H

#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QPixmap>

class QHBoxLayout;

class ProfileItem : public QWidget
{
    Q_OBJECT

public:
    explicit ProfileItem(QWidget *parent = 0);

public slots:
    void setAvatarImage(const QString &avatarImage);
    void setAvatarName(const QString &avatarName);
    void buttonPushed();

private:
    QPixmap pixmap;
    QLabel m_avatarImageLabel;
    QPushButton m_avatarTextButton;

    QHBoxLayout *m_pHorizontalLayout;

};

#endif // PROFILEITEM_H

プロファイル.cpp

#include "Profile.h"

#include <QPixmap>
#include <QHBoxLayout>
#include <QBitmap>
#include <QMessageBox>

ProfileItem::ProfileItem(QWidget *parent) :
    QWidget(parent)
{
    pixmap = QPixmap(":/avatar");

    m_avatarImageLabel.setPixmap(pixmap);
    m_avatarImageLabel.setMask(pixmap.mask());
    m_avatarTextButton.setText("Test");
    connect(&m_avatarTextButton, SIGNAL(clicked()), this, SLOT(buttonPushed()));

    m_pHorizontalLayout = new QHBoxLayout;

    m_pHorizontalLayout->addWidget(&m_avatarImageLabel);
    m_pHorizontalLayout->addWidget(&m_avatarTextButton);

    setLayout(m_pHorizontalLayout);
}

void ProfileItem::setAvatarImage(const QString &avatarImage)
{
    pixmap = QPixmap(avatarImage);
    m_avatarImageLabel.setPixmap(pixmap);
    m_avatarImageLabel.setMask(pixmap.mask());
}

void ProfileItem::setAvatarName(const QString &avatarName)
{
    m_avatarTextButton.setText(avatarName);
}

void ProfileItem::buttonPushed()
{
    QMessageBox msg;
    msg.setText("Button was pushed!");
    msg.exec();
}

View.h

#ifndef VIEW_H
#define VIEW_H

#include <QListView>

class View : public QListView
{
public:
    View();

    void setModel(QAbstractItemModel *model);
    QSize sizeHint();
};

#endif // VIEW_H

View.cpp

#include "View.h"
#include "Profile.h"

View::View()
{
    viewport()->setAutoFillBackground(false);
    setSelectionMode(QAbstractItemView::SingleSelection);
}

void View::setModel(QAbstractItemModel* model)
{
    QListView::setModel(model);

    for (int i = 0; i < 5; ++i)
    {
        QModelIndex index = model->index(i, 0);

        ProfileItem* widget = new ProfileItem();
        setIndexWidget(index, widget);
    }
}

QSize View::sizeHint()
{
    return QSize(ProfileItem().width(), ProfileItem().height());
}

すべてのリスト項目に必要なウィジェットを入力するのを手伝ってくれる人、または私が間違っていることやヒントを教えてくれる人はいますか? Qt でこの MVC スタイルのリスト/テーブル項目としてウィジェットを持つことは可能ですか? これを達成するための参照はどこにも見つかりませんでした。Qtを使用したC++ GUIプログラミング、高度なQtプログラミング、Qt 4を使用したC++のデザインパターンの紹介、およびインターネット上のいくつかの場所で検索しましたQAbstractItemView::setIndexWidgetが、ウィジェットをリストとして追加する方法であると思われる関連するものは見つかりませんでしたアイテムの表示。

ありがとうございました!

4

1 に答える 1

1

ウィジェットは setIndexWidget で追加するのではなく、デリゲートで作成する必要があると思います。

いくつかの例を参照してください:
http://doc.qt.digia.com/stable/itemviews-spinboxdelegate.html
http://www.qtforum.org/article/24195/qpushbutton-as-delegate-in-a-qtableview.html
Qt では、どのようにデリゲートを適切に実装しますか?

于 2013-02-17T09:30:33.787 に答える