用两个QGraphicsSimpleTextItem-s创建一个QGraphicsItemGroup



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

对于那里的每个人,我想构建一个由两个QGraphicsSimpleTextItem-s垂直对齐和居中组成的QGraphicsItemGroup。一个是人名,一个是他们的姓。每个都有自己的字体&颜色。我不想使用一个沉重的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许可)在我的basixmo项目github,文件guqt。Cc,提交99fd6d7c1ff261。它不是一个系谱项目,而是一个抽象的语法树编辑器,类似于具有持久性的解释器。相关类为BxoCommentedObjrefShow;我显示的不是名字,而是像_7rH2hUnmW63o78UGC这样的id,而不是姓氏,我显示的是像body of test1_ptrb_get这样的简短评论。basixmo项目本身是在c++ 11中对melt-monitor-2015的试探性重写。Qt5

似乎你认为QGraphicsLinearLayout的目的不是它的真正目的:

来自官方QT 5.7文档

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

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

相关内容

  • 没有找到相关文章

最新更新