创建QGraphicsView对象的QListView

时间:2012-11-26 14:17:45

标签: qt model-view-controller qlistview qabstractlistmodel

我希望能够创建一个垂直的项目列表,这些项目的外观与您在PowerPoint中看到的内容类似,它显示了代表每张幻灯片的垂直列表。

我认为使用QListViewQAbstractListModel是正确的方法。我的QAbstractListModel子类包含QList QGraphicsViews。因此,每个图块(或幻灯片)都是QGraphicsView。我花了很多时间试图在互联网上找到一个类似的例子,我也一直在使用Qt的例子,但没有太多运气。

这是我的模特课......

我可以在addgvw中收到“添加”消息,但我无法在data中收到“HERE”消息。

myDataModel::myDataModel(QObject *parent) : QAbstractListModel(parent)
{
}

QVariant myDataModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
    {
        return QVariant();
    }

    cGraphicsViewWrapper* gvw = GVWrapperList.at(index.row());

    if (role == Qt::DisplayRole)
    {
        qDebug() << "HERE";

        //Return the QGraphicsView object to display
        return QVariant::fromValue(gvw->gvwView());
    }

    return QVariant();
}

int myDataModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);

    return GVWrapperList.size();
}

void myDataModel::addgvw(int role, cGraphicsViewWrapper& gvw)
{
    if (role == Qt::EditRole)
    {
        beginInsertRows(QModelIndex(), GVWrapperList.size(), GVWrapperList.size());

        GVWrapperList.append(&gvw);

        qDebug() << "ADDING " << GVWrapperList.size() << rowCount();

        endInsertRows();
    }
}

这就是我使用模型类的方法......

在我的widget类的构造函数中,我调用

myGVWWidget::myGVWWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::myPlottingWidget)
{
    ui->setupUi(this);

    Model = new myDataModel(this);

    ui->GWVListView->setModel(Model);

    connectAllSignals();
}

...然后在我创建新图块的函数中,创建图块后我调用...

Model->addChart(Qt::EditRole, *gvw);

最后,我的小部件是空的:(

编辑:我想补充一下,因为我认为我可能会被问到,出于多种原因,我对转换为QPixMap并显示图像的图像不感兴趣。

1 个答案:

答案 0 :(得分:1)

您的问题是QAbstractItemView,朋友希望DisplayRole数据是QS字符串而不是其他内容:

http://doc.qt.digia.com/qt/qt.html#ItemDataRole-enum

您最好的选择是QListWidget,它可以使用QWidget项目:http://doc.qt.digia.com/qt/qlistwidget.html#setItemWidget

此外,使用QGraphicsView会带来巨大的开销。 QGraphicsView是一个非常复杂的小部件,它需要的QGraphicsScene更加复杂。如果列表中有多个项目,请为性能降低做好准备。

你真的太过分了。 :)