(Qt)渲染场景,不同项目在相同的相对位置

时间:2014-05-21 14:29:55

标签: qt view printing render scene

我有一个包含我的数据的QSqlTableModel模型。 我创建了一个QGraphicsScene场景和一个QGraphicsView视图,因此用户可以移动相同的myQGraphicsTextItem文本项直到所需的位置。

这样的事情:

myQWidget::myQWidget()
{
    //these are member of my class
    chequeScene = new QGraphicsScene();
    chequeView = new QGraphicsView();
    model = new QSQLTableModel();

    //populate model, inialize things here...

    //add predefined items to the scene
    setScene();
}

有一个按钮来显示视图并移动场景的文本项目。效果很好。

这是一个调用属于该类的插槽打印的按钮。它配置一个QPrinter,然后调用以下绘制方法myQWidget :: paint(),之后调用该场景 - > render()。

以下方法的海豚是在配置为具有与场景相同的尺寸的纸张上打印数据,同时在textItem在场景上具有相同的相对位置打印数据。不能使用QList,它不会按照我将它们添加到场景中的相同方式对项目进行排序。 这是我的下面的代码,它打印出一些字段doe重叠到场景中出现的QList订单项。

void myQWidget::paint()
{
    qreal dx = 0;
    qreal dy = 0;
    QList<QGraphicsItem*> L = chequeScene->items();

    for (int j=0; j<model->columnCount(); j++) {


        if(!L.isEmpty())
        {
            //Saves the position on dx, dy
           dx = L.first()->scenePos().x();
           dy = L.first()->scenePos().y();
           chequeScene->removeItem( L.first() );
           delete L.first();
           L.removeFirst();
        }



        QString txt("");

        //selecting printing formar for each column
        switch(j)
        {
           case COLUMNADEFECHA:
              txt = QDate::fromString(model->data(model->index(chequenum,j)).toString(), "yyyy/MM/dd").toString("dd/MM/yyyy");
              break;
           case COLUMNADECHEQUES:
              break;
           default:
               txt = model->data(model->index(chequenum,j)).toString();
               break;


        }

        //filtering not important columns
        if(j!=COLUMNADECHEQUES)
        {
           //Supposubly item with the desired information is added to the scene
           //on the same position it had before. Not working.
           GraphicsTextItem *item=new GraphicsTextItem();
           item->setPlainText(txt);
           item->setPos(dx,dy);
           chequeScene->addItem(item);
        }

    }
}

关于如何使这个工作的任何想法?

1 个答案:

答案 0 :(得分:0)

我认为你在dx和dy中获取scenePos但是使用setPos函数进行设置。
另外,当你使用GraphicsTextItem而不是QGraphicsTextItem时,看看你的paint方法将有助于理解这个问题。

尝试使用item->mapFromScene(dx, dy),然后使用这些坐标按item->setPos(..)设置项目位置。

希望这有助于..