圖形視圖框架中自定義QGraphicsItem

一:自定義的QGraphicsItem的定義


4,要使用信號槽功能

1,Item最好繼承QGraphicsObject(父類是QGraphicsItem,QObject);

2,多重繼承;

,GraphicsView框架下圖元的拖放操作

1,拖動源操作,開始拖動


2,拖動進入


3,拖動鬆開事件


三,繼承文本的例子

頭文件

#ifndef TEXTEDIT_H
#define TEXTEDIT_H

#include <QGraphicsTextItem>
#include <QString>
#include <QDebug>
#include <QMessageBox>
#include <QPoint>
#include <QGraphicsSceneMouseEvent>
#include <QMimeData>
#include <QDrag>
#include <QFont>
#include <QPointF>

//系統時間
#include <QDate>
#include <QTime>

//文字處理類
class TextEdit : public QGraphicsTextItem
{
    Q_OBJECT
public:
    explicit TextEdit(QGraphicsTextItem * parent = 0);
    void  setTextToItem(QString intoText="請輸入文本內容");     //設置文本到字體項目
    void  setTextItemFont(QFont font,int size=20,int interval=0,int rotate=0);   //設置文本的字體
    void  setTextPosition(int x,int y); //設置文本的位置

    //區分是文本類型
    int type() const
    {
        return 0;
    }
    //存儲文本的信息
    struct TextInfo
    {
        QPoint textPos; //文本位置
        int textWidth;   //文本寬度
        int textHeight;  //文本高度
        int textRotation; //文本角度
        QFont textFont;     //文本字體
        int textSize;      //文本字號
        int textInterval;  //文本間距
    };
signals:
    void textItemPositionChanged(QPointF point);  //文本項目的位置
    void textinformation(QPoint position,QFont font,int size,int interval,int rotation,int width,int heigh,QString text);  //文本類的信息  字體、大小、間距、角度、寬度、高度
public slots:
    void getTextItemInfo();  //得到的文本的位置信息
public:
    int lastRotation;  //角度信息
    TextInfo textInfo;  //文本信息
    QString textString; //文本字符串

//顯示內容
public:
   void showTextContents();

};

#endif // TEXTEDIT_H

源代碼

#include "textedit.h"


TextEdit::TextEdit(QGraphicsTextItem* parent) :
 QGraphicsTextItem(parent=0)
{
    setFlag(QGraphicsItem::ItemIsFocusable); //項目可以聚焦
    setFlag(QGraphicsItem::ItemIsMovable);
    setFlag(QGraphicsItem::ItemIsSelectable,true);
    //關聯位置變化槽函數
    connect(this,SIGNAL(xChanged()),this,SLOT(getTextItemInfo()));
    connect(this,SIGNAL(yChanged()),this,SLOT(getTextItemInfo()));
    QFont font;
    setTextItemFont(font,20,0,0);

    this->hide();  //初始化成功之後對項目進行隱藏
}

//將需要顯示的文本放到字體項目中
void TextEdit::setTextToItem(QString intoText)
{
    qDebug()<<"TextEdit::setTextToItem()"<<intoText;
    //插入文本
    //向字體項目中添加文字
    this->setPlainText(intoText);
    textString=intoText;
    QFontMetrics fm(this->font());   //字體的測量
    textInfo.textWidth=fm.width(textString);  //得到文本的寬度
    textInfo.textHeight=fm.height();  //得到文本的高度

    getTextItemInfo(); //更新信息

}

//設置顯示的字體、大小、間距
void  TextEdit::setTextItemFont(QFont font,int size,int interval,int rotate)
{
   font.setPixelSize(size);  //設置字體的大小
   font.setLetterSpacing(QFont::AbsoluteSpacing,interval);  //設置字體的間距
   this->setFont(font);
   this->setRotation(rotate);  //設置旋轉的角度

   //記錄文本的位置信息
   textInfo.textPos.rx()=this->pos().rx();
   textInfo.textPos.ry()=this->pos().ry();
   //記錄文本的字體、大小、間距、角度、寬度、高度
   textInfo.textFont=font;
   textInfo.textSize=textInfo.textFont.pixelSize();
   textInfo.textInterval=textInfo.textFont.letterSpacing();
   textInfo.textRotation=this->rotation();  //得到角度
   QFontMetrics fm(this->font());   //字體的測量
   textInfo.textWidth=fm.width(textString);  //得到文本的寬度
   textInfo.textHeight=fm.height();  //得到文本的高度

   getTextItemInfo(); //更新信息
}

//得到文本項目的位置
void TextEdit::getTextItemInfo()
{
    textInfo.textPos.rx()=this->pos().rx();
    textInfo.textPos.ry()=this->pos().ry();
    emit textinformation(textInfo.textPos,textInfo.textFont,textInfo.textSize,textInfo.textInterval,
                         textInfo.textRotation,textInfo.textWidth,textInfo.textHeight,textString);
}
//設置文本的位置
void  TextEdit::setTextPosition(int x,int y)
{
    this->setPos(x,y);
    textInfo.textPos.rx()=x;
    textInfo.textPos.ry()=y;
}

//顯示文本內容
void TextEdit::showTextContents()
{
     this->show();
}




博文索引  持續更新中。。。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章