Добрый день!!!
Я новичок во все этом-поэому прошу меня простить, если спрошу какую-нить глупость.
Пытаюсь сделать дерево(TreeModel) - элементы(TreeItem) которого можно перетаскивать в область, чтобы потом можно было отобразить данные связанные с этим элементом.
При этом есть возле каждого элемента должен быть checkbox - т.е перетащил и в checkbox появилась галочка.
Делаю вот такой код:
я выложу пока только .h - файлы, если понадобиться - то и конечно .cpp
TreeModel
#ifndef TREEMODEL_H
#define TREEMODEL_H
#include <QAbstractItemModel>
#include <QModelIndex>
#include <QVariant>
#include <QItemDelegate>
class TreeItem;
class TreeModel : public QAbstractItemModel
{
Q_OBJECT
public:
TreeModel(const QStringList &headers, const QString &data,
QObject *parent = 0);
~TreeModel();
QVariant data(const QModelIndex &index, int role) const;
QVariant headerData(int section, Qt::Orientation orientation,
int role = Qt::DisplayRole) const;
QModelIndex index(int row, int column,
const QModelIndex &parent = QModelIndex()) const;
QModelIndex parent(const QModelIndex &index) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
bool setData(const QModelIndex &index, const QVariant &value,
int role = Qt::EditRole);
bool setHeaderData(int section, Qt::Orientation orientation,
const QVariant &value, int role = Qt::EditRole);
bool insertColumns(int position, int columns,
const QModelIndex &parent = QModelIndex());
bool removeColumns(int position, int columns,
const QModelIndex &parent = QModelIndex());
bool insertRows(int position, int rows,
const QModelIndex &parent = QModelIndex());
bool removeRows(int position, int rows,
const QModelIndex &parent = QModelIndex());
QMimeData *mimeData(const QModelIndexList &indexes) const;
Qt::DropActions supportedDropActions() const;
QStringList mimeTypes() const;
private:
void setupModelData(const QStringList &lines, TreeItem *parent);
TreeItem *getItem(const QModelIndex &index) const;
TreeItem *rootItem;
};
#endif
TreeItem
#ifndef TREEITEM_H
#define TREEITEM_H
#include <QList>
#include <QVariant>
#include <QVector>
#include <QTreeWidgetItem>
#include <QCheckBox>
class TreeItem
{
public:
TreeItem(const QVector<QVariant> &data, TreeItem *parent = 0);
~TreeItem();
TreeItem *child(int number);
int childCount() const;
int columnCount() const;
QVariant data(int column) const;
bool insertChildren(int position, int count, int columns);
bool insertColumns(int position, int columns);
TreeItem *parent();
bool removeChildren(int position, int count);
bool removeColumns(int position, int columns);
int childNumber() const;
bool setData(int column, const QVariant &value);
void setUserData(const QVariant &value);
QVariant getUserData();
private:
QList<TreeItem*> childItems;
QVector<QVariant> itemData;
TreeItem *parentItem;
QVariant userdata;
};
ItemDelegate
#ifndef ITEMDELEGATE_H
#define ITEMDELEGATE_H
#include <QObject>
#include <QApplication>
#include <QItemDelegate>
#include <QRect>
#include <QEvent>
#include <QKeyEvent>
#include <QMouseEvent>
class ItemDelegate: public QItemDelegate
{
public:
ItemDelegate(QObject* parent = 0);
virtual void drawCheck(QPainter * painter,
const QStyleOptionViewItem & option,
const QRect & rect,
Qt::CheckState state ) const;
virtual bool editorEvent ( QEvent * event,
QAbstractItemModel * model,
const QStyleOptionViewItem & option,
const QModelIndex & index );
virtual void drawFocus ( QPainter * painter,
const QStyleOptionViewItem & option,
const QRect & rect ) const;
};
#endif // ITEMDELEGATE_H
ну соответственно... :
QStringList headers;
headers<<tr("Channel")<<tr("type");
QTreeView *treeview = new QTreeView;
treeview->setDragEnabled(true);
treeview->setDropIndicatorShown(true);
model = new TreeModel(headers,NULL);
treeview->setModel(model);
treeview->setItemDelegate(new ItemDelegate);
....
У меня получается так, что названия накладываются на чекбоксы, как этого избежать?