QGraphicsTextItem 是不是支持垂直居中对齐?
Posted
技术标签:
【中文标题】QGraphicsTextItem 是不是支持垂直居中对齐?【英文标题】:Does QGraphicsTextItem support vertical-center alignment?QGraphicsTextItem 是否支持垂直居中对齐? 【发布时间】:2015-04-07 03:16:27 【问题描述】:基本上,我想知道为什么文本对齐标志和setPageSize
的组合最终不会使文本居中显示。
以下程序几乎完全符合我的要求,只是文本最终仅水平居中。
#include <QApplication>
#include <QMainWindow>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsTextItem>
#include <QTextDocument>
int main(int argc, char *argv[])
QApplication a(argc, argv);
QMainWindow *mainWindow = new QMainWindow(0, Qt::FramelessWindowHint);
QGraphicsView view;
view.setAlignment(Qt::AlignLeft | Qt::AlignBottom);
view.setFrameStyle(0);
view.setBackgroundBrush(QBrush(QColor(Qt::black)));
mainWindow->setCentralWidget(&view);
QGraphicsScene scene(0, 0, 640, 480);
QGraphicsTextItem textItem;
textItem.setTextWidth(640);
textItem.document()->setPageSize(QSizeF(640, 480));
textItem.document()->setDocumentMargin(0);
textItem.document()->setDefaultTextOption(QTextOption(Qt::AlignCenter | Qt::AlignVCenter));
textItem.setDefaultTextColor(QColor(Qt::white));
textItem.setFont(QFont("monospace", 18, 63));
textItem.sethtml("Center me!");
scene.addItem(&textItem);
textItem.setVisible(true);
view.setScene(&scene);
mainWindow->show();
return a.exec();
我还应该注意,这个项目受限于 Qt 4.7.1。
如何使用QGraphicsTextItem
在QGraphicsView
的中心水平和垂直对齐文本?我也可以使用基于样式表的解决方案。
【问题讨论】:
【参考方案1】:不,它没有。
This bug 表示QTextDocument
(底层文本呈现对象)专门不尝试垂直对齐。环顾四周,大多数解决方法分为两类。对于简单(即单行纯文本)应用程序,实现一个代理项,在其重载的paint
方法中呈现文本,如下所示:
class MyProxyGraphicsItem: public QGraphicsItem
public:
explicit MyProxyGraphicsItem(QString text, QRectF geometry, QGraphicsItem *parent=0) :
QGraphicsItem(parent), text(text), geometry(geometry)
virtual ~MyProxyGraphicsItem()
QRectF boundingRect() const return geometry;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
painter->drawText(geometry, text, Qt::AlignCenter | Qt::AlignVCenter);
private:
QRectF geometry;
QString text;
对于多行纯文本或富文本 (HTML),请改用 QLabel
,如下所示:
#include <QApplication>
#include <QMainWindow>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsTextItem>
#include <QLabel>
int main(int argc, char *argv[])
QApplication a(argc, argv);
QMainWindow *mainWindow = new QMainWindow(0, Qt::FramelessWindowHint);
QGraphicsView view;
view.setAlignment(Qt::AlignLeft | Qt::AlignBottom);
view.setFrameStyle(0);
view.setBackgroundBrush(QBrush(QColor(Qt::black)));
mainWindow->setCentralWidget(&view);
QGraphicsScene scene(0, 0, 640, 480);
QLabel label("<div style=\"color:white;\">Center me!</div>");
label.setWordWrap(true);
label.setAlignment(Qt::AlignCenter | Qt::AlignVCenter);
label.setFont(QFont("monospace", 18, 63));
scene.addWidget(&label)->setGeometry(QRectF(0,0,480,640));
view.setScene(&scene);
mainWindow->show();
return a.exec();
【讨论】:
以上是关于QGraphicsTextItem 是不是支持垂直居中对齐?的主要内容,如果未能解决你的问题,请参考以下文章
如何从主 QWidget 中移除 QGraphicsTextItem 的焦点
更改 QGraphicsTextItem 内文本的突出显示颜色