文本在图形视图在Qt
Text in graphicsView in Qt
我正在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();
}
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 控制带有信号/插槽的Qt QML滑动视图
- 透视视图的任何解决方案 openGL qt.
- Qt 如何使用鼠标移动事件移动视图
- 当用户在键盘上按住 CTRL 键时,如何在树视图中的 Qt 中实现多选?
- QT Filesystembrowser:如何更改根目录和更新视图
- 将树视图链接到表视图?[QT]
- Qt:将 c++ 中的列表连接到 QML 中的列表视图
- 如何在按下按钮时在Qt表格视图中自动选择下一行?
- Qt C++ - 在一个视图中显示来自多个SQLite表的数据
- 在QT视图中显示位图数据
- Qt中数据类(模型)和视图/控制器类之间的数据通信的正确方式是什么
- Qt在QtWebEngine视图中显示QImage或像素映射(从C++到HTML)
- Qt- 设置来自表视图的输入的验证器
- QT MVC 模式未更新视图 - 特定的 SimpleTreeModel 示例
- 无法在 QML 列表视图中调用 Qt c++ 方法
- 用鼠标中键按下qt图表移动视图
- Qt c++ 在表格视图中换行文本(富文本)
- 了解Qt视图模型架构:何时创建以及如何在QAbstractItemModel实现中清除索引