だから私が欲しいのは、選択可能なウィジェットを表示するqlistviewです(ボタンの画像とテキストを表示するラベル(ウィジェットはaとaの水平レイアウトを持つqwidgetベースのウィジェットですQLabel
)QPushButton
)。モデルは、各アイテムの画像パスとボタン テキストを保存する必要があります (これは問題ではないようです)。QListView 派生ウィジェットを正常に作成しましたが、最初のリスト項目 (カスタム ウィジェット) しか表示されず、選択できません。カスタム モデル、ビュー、およびデリゲートを作成しましたが、最初だけでなく、すべてのリスト アイテムにウィジェットを表示する方法がわかりません。完全なソースコードのリンクは次のとおりです: SOURCE CODE LINK
5 つのウィジェット アイテムのリストと 1 つのウィジェット アイテムのリストを別々にアプリケーションを実行しました。そして、ウィジェットを追加すると思いますが、最初のウィジェットでそれらすべてが重なっています(5つのアイテムのビルドでは、ボタンに濃い影があります):
リストにある 5 つのウィジェット:
リスト内の 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
が、ウィジェットをリストとして追加する方法であると思われる関連するものは見つかりませんでしたアイテムの表示。
ありがとうございました!