簡體   English   中英

圖形中的文本在Qt中查看

[英]Text in graphicsView in Qt

我正在Qt中創建一個應用程序,在其中可以單擊按鈕在圖形視圖中添加不同的實體。 我希望該用戶單擊按鈕時可以在圖形視圖中添加文本。 如何使用QGraphicsTextItem這樣做? 我的應用程序中有不同的按鈕,例如畫線,用戶在其中指定點的圓圈。 同樣,我有一個添加文本的按鈕。 我已經看到我們可以實現在圖形視圖中添加文本的實現:

addText(“ hello”)

該文本已經定義。 我希望該文本應在運行時輸入,而不應該是靜態的或預定義的。

您提供的信息很少。 QTextDocument ,您應該能夠通過調用QGraphicsTextItem::document ()獲得與QGraphicsTextItem關聯的QTextDocument 如果您不想做任何花哨的事情,應該可以通過調用QTextDocument::setPlainText ( const QString & text )來設置/替換項目的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();
}

“完成”示例

mainwindow.ui (使用qt設計器創建)

<?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>

主窗口

#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                   

主窗口

#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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM