添加文本在GraphicsView在Qt

Adding Text in GraphicsView in Qt

本文关键字:Qt GraphicsView 添加 文本      更新时间:2023-10-16

我正在实现一个代码来添加一个按钮单击不同的实体。我得到一个问题,在图形视图中添加文本。以下是我正在实现的代码片段。需要做些什么?mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPaintEvent>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QPainter>
#include "line.h"
#include "circle.h"
#include "ellipse.h"
#include "point.h"
#include "arc.h"
#include "text.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
protected:
    void wheelEvent(QWheelEvent* event);
private:
    Ui::MainWindow *ui;
    bool mFirstClick;
    bool mPaintFlag;
    int mStartX;
    int mStartY;
    int mEndX;
    int mEndY;
    QGraphicsScene *scene;
    QPainter *painter;
    point *item;
    line *item1;
    circle *item2;
    ellipse *item3;
    arc *item4;

private slots:
    void drawPoint();
    void drawLine();
    void drawCircle();
    void drawEllipse();
    void drawArc();
    void drawText();
    void on_actionSave_triggered();
    void on_actionOpen_triggered();
    void on_actionQuit_2_triggered();
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMouseEvent>
#include<QFileDialog>
#include<QMessageBox>
#include<QTextEdit>
#include<QString>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle(tr("GD CAD"));
    scene =  new QGraphicsScene;
    for(int x = 0; x <= ui->graphicsView->width(); x += 10){
        scene->addLine(x,0,x,ui->graphicsView->height(),QPen(Qt::green));
    }
    for(int y = 0; y <= ui->graphicsView->height(); y += 10){
        scene->addLine(0,y,ui->graphicsView->width(),y,QPen(Qt::green));
    }
    for(int x = 10; x <= ui->graphicsView->width(); x += 100){
        scene->addLine(x,0,x,ui->graphicsView->height(),QPen(Qt::darkGreen));
    }
    for(int y = 10; y <= ui->graphicsView->height(); y += 100){
        scene->addLine(0,y,ui->graphicsView->width(),y,QPen(Qt::darkGreen));
    }
    ui->graphicsView->setScene(scene);
    connect(ui->pointButton, SIGNAL(clicked()), this, SLOT(drawPoint()));
    connect(ui->lineButton, SIGNAL(clicked()), this, SLOT(drawLine()));
    connect(ui->circleButton, SIGNAL(clicked()), this, SLOT(drawCircle()));
    connect(ui->ellipseButton, SIGNAL(clicked()), this, SLOT(drawEllipse()));
connect(ui->arcButton, SIGNAL(clicked()),this, SLOT(drawArc()));
connect(ui->text,SIGNAL(clicked()),this,SLOT(drawText()));
connect(ui->actionPoints, SIGNAL(triggered()), this, SLOT(drawPoint()));
    connect(ui->actionLine, SIGNAL(triggered()), this, SLOT(drawLine()));
    connect(ui->actionCircle, SIGNAL(triggered()), this, SLOT(drawCircle()));
    connect(ui->actionEllipse, SIGNAL(triggered()), this, SLOT(drawEllipse()));
}
void MainWindow::drawPoint(){
    ui->graphicsView->setScene(scene);
    item = new point;
    scene->addItem(item);
    qDebug() << "Point Created";
    connect(item, SIGNAL(DrawFinished()), this, SLOT(drawPoint()));
}
void MainWindow::drawLine(){
    ui->graphicsView->setScene(scene);
    item1 = new line;
    scene->addItem(item1);
    qDebug() << "Line Created";
    connect(item1, SIGNAL(DrawFinished()), this, SLOT(drawLine()));
}
void MainWindow::drawCircle(){
    ui->graphicsView->setScene(scene);
    item2 = new circle;
    scene->addItem(item2);
    qDebug() << "Circle Created";
    connect(item2, SIGNAL(DrawFinished()), this, SLOT(drawCircle()));
}
void MainWindow::drawArc(){
    ui->graphicsView->setScene(scene);
    item4 = new arc;
    scene->addItem(item4);
    qDebug() << "Circle Created";
    connect(item4, SIGNAL(DrawFinished()), this, SLOT(drawArc()));
}
void MainWindow::drawEllipse(){
    ui->graphicsView->setScene(scene);
    item3 = new ellipse;
    scene->addItem(item3);
    qDebug() << "Ellipse Created";
    connect(item3, SIGNAL(DrawFinished()), this, SLOT(drawEllipse()));
}
void MainWindow::wheelEvent(QWheelEvent* event) {
    ui->graphicsView->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
    // Scale the view / do the zoom
    double scaleFactor = 1.15;
    if(event->delta() > 0) {
        // Zoom in
        ui->graphicsView->scale(scaleFactor, scaleFactor);
    } else {
        // Zooming out
        ui->graphicsView->scale(1.0 / scaleFactor, 1.0 / scaleFactor);
    }
}
void MainWindow::on_actionOpen_triggered()
                        {
                            QString filename=QFileDialog::getOpenFileName(
                                        this,
                                        tr("Open File"),
                                        QString(),
                                        tr("file Name(*.dwg|*.DWG|*.dxf)")
                                        );
                            if (!filename.isEmpty()) {
                                QFile file(filename);
                                if (!file.open(QIODevice::ReadOnly)) {
                                    QMessageBox::critical(this,
tr("Error"), tr("Could not open file"));
                                    return;
                                }
                            }
                        }
                        void MainWindow::on_actionSave_triggered()
                        {
                             QString filename=QFileDialog::getSaveFileName(
                                         this,
                                         tr("Save File"),
                                         QString(),
                                         tr("file Name(*.txt)")
                 );
     if(!filename.isEmpty()) {
         QFile file(filename);
         if (!file.open(QIODevice::WriteOnly)) {
             QMessageBox::critical(this, tr("Error"), tr("Could not open file"));
             return;
         } else {
             QTextStream stream(&file);
             QTextEdit *textEdit;
             stream << textEdit->toPlainText();
             stream.flush();
             file.close();
         }
     }
}
void MainWindow::on_actionQuit_2_triggered(){
    MainWindow *window;
    window->close();
}
void MainWindow::drawText(){
    ui->graphicsView->setScene(scene);
    text *item5 = new text;
    scene->addItem(item5);
    qDebug() << "text created";
    connect(item5, SIGNAL(DrawFinished()), this, SLOT(drawText()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

text.h

#ifndef TEXT_H
#define TEXT_H
#include <QGraphicsTextItem>
#include <QPen>
#include<QFocusEvent>
#include<QGraphicsItem>
#include<QGraphicsScene>
#include<QGraphicsSceneMouseEvent>
#include<QGraphicsTextItem>
#include<QFont>
#include"mainwindow.h"
#include"ui_mainwindow.h"
class text:public QGraphicsTextItem
{
    Q_OBJECT
public:
    enum { Type = UserType + 3 };
    enum Mode {  InsertText };
     void setFont(const QFont &font);

    text(QGraphicsItem *parent = 0);
    int type() const { return Type; }
public slots:
    void setMode(Mode mode);
signals:
    void lostFocus(text *item);
    void selectedChange(QGraphicsItem *item);
    void textInserted(QGraphicsTextItem *item);
    void itemSelected(QGraphicsItem *item);
protected:
    QVariant itemChange(GraphicsItemChange change, const QVariant &value);
    void focusOutEvent(QFocusEvent *event);
    void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
    void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent);
private:
Mode myMode;
QFont myFont;};
#endif // TEXT_H

text.cpp

#include "text.h"
#include"mainwindow.h"
#include"ui_mainwindow.h"

text::text(QGraphicsItem *parent):QGraphicsTextItem(parent)
{
    setFlag(QGraphicsItem::ItemIsMovable);
     setFlag(QGraphicsItem::ItemIsSelectable);
}
QVariant text::itemChange(GraphicsItemChange change,
                     const QVariant &value)
{
    if (change == QGraphicsItem::ItemSelectedHasChanged)
        emit selectedChange(this);
    return value;
}
void text::focusOutEvent(QFocusEvent *event)
{
    setTextInteractionFlags(Qt::NoTextInteraction);
    emit lostFocus(this);
    QGraphicsTextItem::focusOutEvent(event);
}
void text::setMode(Mode mode)
{
    myMode = mode;
}
void text::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{
    if (textInteractionFlags() == Qt::NoTextInteraction)
        setTextInteractionFlags(Qt::TextEditorInteraction);
    QGraphicsTextItem::mouseDoubleClickEvent(event);
}
void text::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    if (mouseEvent->button() != Qt::LeftButton)
        return;

    switch(myMode){
    case InsertText:
        text *textItem;
                textItem = new text();
//                textItem->setFont(myFont);
                  textItem->setPlainText("hello");
                textItem->setTextInteractionFlags(Qt::TextEditorInteraction);
                textItem->setZValue(1000.0);
                connect(textItem, SIGNAL(lostFocus(DiagramTextItem*)),
                        this, SLOT(editorLostFocus(DiagramTextItem*)));
                connect(textItem, SIGNAL(selectedChange(QGraphicsItem*)),
                        this, SIGNAL(itemSelected(QGraphicsItem*)));
                //addItem(textItem);
//              textItem->setDefaultTextColor(myTextColor);
                textItem->setPos(mouseEvent->scenePos());
                emit textInserted(textItem);
    //! [8] //! [9]
        default:
;
        }
//        QGraphicsScene::mousePressEvent(mouseEvent);
}

嗯,如果我没弄错的话,看起来你确实在设置文本项的各种属性,比如交互标志、z值、颜色等等——除了实际的文本之外的所有属性。文本将是空的,因此您的QGraphicsTextItem将是不可见的。在文本项上使用set明文(),sethhtml()或setDocument()。有两个地方可以创建文本项;一个在主窗口中。cpp:

void MainWindow::drawText(){
      ui->graphicsView->setScene(scene);
      text *item5 = new text;
      scene->addItem(item5);
      qDebug() << "text created";
      connect(item5, SIGNAL(DrawFinished()), this, SLOT(drawText()));
  }

文本被创建并添加到场景中(使用addItem()),但它没有实际的内容;设置其内容:

  item5->setPlainText ("Mickey");

第二个文本项是从文本(它是QGraphicsTextItem的子类)类本身内部创建的:

void text::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
  ...
  switch(myMode){
  case InsertText:
    text *textItem;
    textItem = new text();
//  textItem->setFont(myFont);
    textItem->setPlainText("hello");

它被正确创建,并给出一个文本,但没有添加到场景中。将其添加到场景中,例如将其设置为当前文本项的子元素:

 textItem->setParentItem (this);