在Qt中的GraphicsView中添加文本

时间:2014-07-21 08:39:35

标签: c++ qt

我正在实现一个代码,用于在按钮上单击添加不同的实体。我在图形视图中添加Text时出现问题。以下是我正在实施的代码段。需要做什么? 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);
}

1 个答案:

答案 0 :(得分:0)

嗯,如果我没有弄错的话,看起来你确实设置了文本项的各种属性,比如Interaction-flags,z-value,color等等 - 除了实际文本之外的所有内容。文本将为空,因此您的QGraphicsTextItem将不可见。 在文本项上使用setPlainText(),setHtml()或setDocument()。 有两个地方可以创建文本项目;一个是在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()));
  }

创建文本并将其添加到场景中(使用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);