假设我想在一些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
任何提示?或者我的整个方法是错的?
我应该定义一个继承自QGraphicsSimpleTextItem
和QGraphicsLayoutItem
吗?
注意:实际代码(GPlv3已获许可)位于 github 上的basixmo项目中,文件guiqt.cc,提交99fd6d7c1ff261。它不是一个家谱项目,而是一个抽象的语法树编辑器,就像具有持久性的解释器一样。有关课程是BxoCommentedObjrefShow
;我显示的是_7rH2hUnmW63o78UGC
而不是姓氏的ID,而不是名字,我正在显示像body of test1_ptrb_get
这样的简短评论。 basixmo项目本身是C ++ 11& C中melt-monitor-2015的初步重写。 QT5
答案 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();
}
注意:场景空间在两个方向都延伸到无限,因此空间管理非常简单(没有最小/最大尺寸,拉伸等)。