假设我想在一些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
提示吗?还是我的整个方法都错了?
我应该定义一个类继承QGraphicsSimpleTextItem
和QGraphicsLayoutItem
吗?
注:实际代码(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();
}
注意:场景空间在两个方向上延伸到无限,因此空间管理非常简化(没有最小/最大尺寸,拉伸等)