1

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

我相信使用 aQListView和 aQAbstractListModel是解决这个问题的正确方法。我的子QAbstractListModel类包含一个QList. QGraphicsViews因此,每个图块(或幻灯片)都是一个QGraphicsView. 我花了很多时间试图在互联网上找到一个类似的例子,我也一直在使用 Qt 的例子,但运气不佳。

这是我的模型课...

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

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();
    }
}

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

在我的小部件类的构造函数中,我调用

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 并显示图块的图像不感兴趣。

4

1 回答 1

1

您的问题是QAbstractItemView,朋友希望DisplayRoledata 是 QString 而不是别的:

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

您最好的选择是使用QListWidget确实可以QWidget用于项目的方法:http: //doc.qt.digia.com/qt/qlistwidget.html#setItemWidget

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

你真的是在夸大其词。:)

于 2012-11-26T14:51:08.730 回答