Вопрос:
Я реализую код для добавления разных объектов на кнопку click.I есть проблема, чтобы добавить текст в графическом представлении. Ниже приведен фрагмент кода, который я реализую. Что должно быть сделано? 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
Hm, если я не ошибаюсь, похоже, что вы устанавливаете всевозможные свойства текстового элемента, такие как 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);