用两个QGraphicsSimpleTextItem -s创建一个QGraphicsItemGroup?

时间:2016-11-11 16:36:10

标签: linux c++11 qt5

假设我想在一些QGraphicsScene中显示一个简单的家谱树。每个人都有一个名字和一个姓氏(没有显示任何其他名称)。

对于那里的每个人,我想构建一个QGraphicsItemGroup由两个QGraphicsSimpleTextItem - s垂直对齐并居中组成。一个是人名,一个是姓。每个都有自己的字体和颜色。我不想使用沉重的QGraphicsTextItem,因为它太重了(一个名字只有名字和姓氏的人不应该是一个完整的QTextDocument)。

所以我在考虑

 struct Person {
   QGraphicsItemGroup _group;
   QGraphicsLinearLayout _lay;
   QGraphicsSimpleTextItem _firstname;
   QGraphicsSimpleTextItem _lastname;
 public:
   Person(QGraphicsScene*scene, 
          const std::string& first, const std::string& last) 
   : group(), _lay(Qt::Vertical), 
     _firstname(first.c_str()), _lastname(last.c_str()) {
      _lay.addItem(&_firstname);
      _lay.setSpacing(0, 5);
      _lay.addItem(&_lastname);
      _group.addToGroup(&_firstname);
      _group.addToGroup(&_lastname);
      scene->addItem(&_group);
   };
 };

但这不起作用,因为_lay.addItem(&_firstname);无法编译,因为QGraphicsSimpleTextItem不是QGraphicsLayoutItem

任何提示?或者我的整个方法是错的?

我应该定义一个继承自QGraphicsSimpleTextItemQGraphicsLayoutItem吗?

的类

注意:实际代码(GPlv3已获许可)位于 github 上的basixmo项目中,文件guiqt.cc,提交99fd6d7c1ff261。它不是一个家谱项目,而是一个抽象的语法树编辑器,就像具有持久性的解释器一样。有关课程是BxoCommentedObjrefShow;我显示的是_7rH2hUnmW63o78UGC而不是姓氏的ID,而不是名字,我正在显示像body of test1_ptrb_get这样的简短评论。 basixmo项目本身是C ++ 11& C中melt-monitor-2015的初步重写。 QT5

1 个答案:

答案 0 :(得分:1)

看起来你认为QGraphicsLinearLayout的目的不是真正的目的:

来自Official QT 5.7 documentation

  

QGraphicsLinearLayout类提供水平或垂直布局,用于在图形视图中管理小部件

不应该在场景中布局普通的绘图项,而是QWidgets。不幸的是,关于它的文档和示例似乎不起作用。

如何实施垂直布局

幸运的是,QGraphicsItem并不难扩展,所以你可以用几行来实现你的文本对:

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsSimpleTextItem>
#include <QGraphicsItemGroup>

class QGraphicsPerson: public QGraphicsItemGroup
{
public:
    QGraphicsPerson( const QString& firstStr,
                     const QString& secondStr,
                     QGraphicsItem *parent=nullptr)
    {
        first.setText(firstStr);
        second.setText(secondStr);
        addToGroup(&first);
        addToGroup(&second);
        second.setPos(first.pos().x(), first.pos().y()+first.boundingRect().height());
    }

protected:
    QGraphicsSimpleTextItem first, second;
};

int main(int n, char **args)
{
    QApplication app(n, args);

    QGraphicsScene scene;
    QGraphicsView window(&scene);

    QGraphicsPerson person( "Adrian", "Maire");
    scene.addItem(&person);
    person.setPos(30,30);

    QGraphicsPerson person2( "Another", "Name");
    scene.addItem(&person2);

    window.show();
    return app.exec();
}

注意:场景空间在两个方向都延伸到无限,因此空间管理非常简单(没有最小/最大尺寸,拉伸等)。