文本在图形视图在Qt

Text in graphicsView in Qt

本文关键字:Qt 视图 图形 文本      更新时间:2023-10-16

我正在Qt中创建一个应用程序,我可以在单击按钮的图形视图中添加不同的实体。我希望用户可以在图形视图中添加文本时,他点击按钮为相同的。我如何使用QGraphicsTextItem来做到这一点?我有不同的按钮在我的应用程序,如绘制线,在其中用户指定这样做的点圆。同样,我有一个按钮来添加文本。我已经看到我们可以实现在图形视图中添加文本:

addText("hello")

此文本已定义。我希望文本应该在运行时输入,它不应该是静态的或预定义的

您提供的信息相当稀疏。从听起来,你应该能够通过调用QGraphicsTextItem::document ()得到与QGraphicsTextItem相关联的QTextDocument。如果您不想做任何花哨的事情,您应该能够通过调用QTextDocument::setPlainText ( const QString & text )来设置/替换条目的文本。如果希望提示用户输入文本,可以使用静态QInputDialog::getText方法从用户那里获得单个QString

这有帮助吗?如果这与您的用例不匹配,您可能需要提供更多的上下文。

编辑:张贴一个关于如何在QGraphicsView/Scene中放置文本的最小示例。你点击一个特定位置的鼠标按钮,它会要求你输入文本,然后把文本放在鼠标点击发生的地方。这有帮助吗?

编辑2:在第一个示例下面添加一个更完整但仍然是虚拟的示例,该示例显示创建一个带有自定义小部件的主窗口和一个用于切换文本插入的虚拟按钮。请注意,这当然不是可用于生产的代码,它应该显示工作原理,并且没有以任何方式进行优化或美化。

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QMouseEvent>
#include <QInputDialog>
class MyGraphicsView: public QGraphicsView
{
public:
  MyGraphicsView( QGraphicsScene *scene, QWidget *parent = 0) : QGraphicsView(scene,parent) {}
public slots:
  void mousePressEvent( QMouseEvent * event );

};
void MyGraphicsView::mousePressEvent( QMouseEvent * event )
{
  const QPoint &pos = event->pos();
  bool ok;
  QString text = QInputDialog::getText(this, tr("QInputDialog::getText()"),
                                   tr("Please enter your text"), QLineEdit::Normal,
                                   "Replace with your text", &ok);
  if (!ok || text.isEmpty()) return;
  QGraphicsTextItem *textItem = this->scene()->addText(text);
  textItem->setPos(mapToScene(pos));
}

int main( int argc, char **argv )
{
    QApplication app(argc, argv);
    QGraphicsScene scene;
    scene.setSceneRect( -100.0, -100.0, 200.0, 200.0 );
    MyGraphicsView view( &scene );
    view.show();
    return app.exec();
}

的完整示例

主窗口。ui(用qt designer创建)

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>640</width>
    <height>480</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <widget class="MyGraphicsView" name="graphicsView"/>
    </item>
    <item row="1" column="0">
     <widget class="QToolButton" name="toolButton">
      <property name="text">
       <string>Add Text</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>640</width>
     <height>27</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <customwidgets>
  <customwidget>
   <class>MyGraphicsView</class>
   <extends>QGraphicsView</extends>
   <header location="global">mygraphicsview.h</header>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

mainwindow.h

#ifndef MYMAINWINDOW_H
#define MYMAINWINDOW_H
#include "mygraphicsview.h"
#include <QGraphicsScene>
#include "ui_mainwindow.h"
#include <QtCore>
class MyMainWindow: public QMainWindow, private Ui::MainWindow
{
  Q_OBJECT
 public:
  MyMainWindow( QWidget *parent = 0 );
  public slots:
  void on_toolButton_clicked( bool checked ) { graphicsView->setAddText(checked); }

};
#endif // MYMAINWINDOW_H                   

mainwindow.cpp

#include "mainwindow.h"
MyMainWindow::MyMainWindow( QWidget * ) {
  setupUi(this);
  QGraphicsScene *scene = new QGraphicsScene;
  scene->setSceneRect( -100.0, -100.0, 200.0, 200.0 );
  toolButton->setCheckable(true);
  graphicsView->setScene(scene);
}

mygraphicsview.h

#ifndef MYGRAPHICSVIEW_H
#define MYGRAPHICSVIEW_H
#include <QGraphicsView>
#include <QGraphicsScene>
class MyGraphicsView: public QGraphicsView
{
  Q_OBJECT
public:
  MyGraphicsView( QWidget *parent = 0) : QGraphicsView(parent), addText(false) {}
  void setAddText(bool state) {addText = state;}
  public slots:
  void mousePressEvent( QMouseEvent * event );
 private:
  bool addText;
};
#endif // MYGRAPHICSVIEW_H         

mygraphicsview.cpp

#include "mygraphicsview.h"
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QMouseEvent>
#include <QInputDialog>
#include <QGraphicsTextItem>


void MyGraphicsView::mousePressEvent( QMouseEvent * event )
{
  if( ! addText) return;
  const QPoint &pos = event->pos();
  bool ok;
  QString text = QInputDialog::getText(this, tr("QInputDialog::getText()"),
                                   tr("Please enter your text"), QLineEdit::Normal,
                                   "Replace with your text", &ok);
  if ( !ok || text.isEmpty()) return;
  QGraphicsTextItem *textItem = this->scene()->addText(text);
  textItem->setPos(mapToScene(pos));
}

main.cpp

#include "mainwindow.h"
#include "mygraphicsview.h"
#include <QApplication>

int main( int argc, char **argv )
{
    QApplication app(argc, argv);
    MyMainWindow m;
    m.show();
    return app.exec();
}