[英]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.