图形视图框架中自定义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();
}




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


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