【问题标题】: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。

如何使用QGraphicsTextItemQGraphicsView 的中心水平和垂直对齐文本?我也可以使用基于样式表的解决方案。

【问题讨论】:

    标签: c++ qt qtgui qt4.7


    【解决方案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();
    }
    

    【讨论】:

      猜你喜欢
      • 2013-02-13
      • 1970-01-01
      • 2013-09-10
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多