2014-07-21 41 views
0

我正在實現一個代碼,用於在按鈕單擊時添加不同的實體。我遇到了在圖形視圖中添加文本的問題。以下是我正在實施的代碼片段。需要做什麼? mainwindow.h在Qt中添加GraphicsView中的文本

#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

「我得到一個問題」 ......這是什麼問題? – TheDarkKnight

+0

它不起作用:(請看看代碼不知道什麼是錯的,它運行成功,但文本按鈕不起作用:( – user3859872

+0

你在期待什麼,你真正看到了什麼。請定義問題,而不是隻是簡單地說「它不起作用」 – TheDarkKnight

回答

0

嗯,如果我沒有記錯的話,它看起來像你正在設置各種公關文本項的功能,比如交互標誌,z值,顏色等等 - 一切都不是實際的文本。文本將是空的,因此您的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); 
+0

我已經使用我的代碼編輯了我的文章,請檢查 – user3859872

+0

您必須有文本實例:一個接收mousePressEvent()和一個由mousePressEvent()處理程序新創建的實例。後者確實具有plainText()集,但未連接到場景(除非textInserted()信號是連接到一些插入到場景中的插槽)前者沒有文本,因此不可見(使用this-> setPlainText()或類似的東西) – rassahah

+0

對不起,我沒有得到你。你能引用一個簡單的例子嗎? – user3859872