简体   繁体   中英

Adding Text in GraphicsView in Qt

I am implementing a code to add different entities on a button click.I am getting a problem to add Text in graphics view. Following is the code snippet that I am implementing. What needs to be done? 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);
}

Hm, if i am not mistaken, it does look like you are setting all kinds of properties of the text item, like Interaction-flags, z-value, color and so on -- everything but not the actual text. The text would be empty and therefore your QGraphicsTextItem will be invisible. Use setPlainText(), setHtml() or setDocument() on your text item. There are two places where text-items are created; one is in the mainwindow.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()));
  }

The text is created and added to the scene (with addItem()), but it does not have an actual content; set its content:

  item5->setPlainText ("Mickey");

The second text-item is created from inside the text (which is a subclass of a QGraphicsTextItem) class itself:

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

It is created correctly, and given a text, but not added to the scene. Add it to the scene, for instance by making it a child of the current text item:

 textItem->setParentItem (this);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM