• 17929阅读
  • 29回复

QGraphisScene 元旦终结者 [复制链接]

上一主题 下一主题
离线robertkun
 

只看楼主 倒序阅读 楼主  发表于: 2009-12-31
— 本帖被 XChinux 执行加亮操作(2010-01-05) —
新的一年又来了,从去年接触Qt 学习已经半年了,按猫画虎我也发个小程序。

里面包含了一些关于 QGraphicsItem 的图元,文本,和样式的设置方法。。。
[ 此帖被robertkun在2010-07-28 16:59重新编辑 ]
附件: happyDraw+new.rar (115 K) 下载次数:761
                                              简单的生活使人快乐!
离线dashanda
只看该作者 1楼 发表于: 2009-12-31
写的不错 顶楼主 不知你qq?
离线robertkun

只看该作者 2楼 发表于: 2009-12-31
终于有人顶了,高兴啊,写的乱,凑合看吧。。。

元旦快乐!
                                              简单的生活使人快乐!
离线zzh442856860
只看该作者 3楼 发表于: 2010-01-03
顶支持楼主
离线pulongpu
只看该作者 4楼 发表于: 2010-01-03
支持楼主
人生得意须尽欢,莫使金樽空对月!!
离线dashanda
只看该作者 5楼 发表于: 2010-01-03
请问:现在在scene中点一下画一个图像,能不能用鼠标拖动画一个想要的图形。这样在初始画图像时,就可以控制大小,应该怎样改代码?谢谢!
离线robertkun

只看该作者 6楼 发表于: 2010-01-04
可以在 scene 中的   mouseMoveEvent  事件中,设置 各个图元的setRect 函数,这样就可以画出需要的大小了。。
                                              简单的生活使人快乐!
离线yleesun

只看该作者 7楼 发表于: 2010-01-04
界面很酷,但是用4.6版本编译不过去!
离线robertkun

只看该作者 8楼 发表于: 2010-01-04
OUT 了,我的环境是4.4.3的,楼上的想想办法,应该可以兼容吧?
                                              简单的生活使人快乐!
离线dashanda
只看该作者 9楼 发表于: 2010-01-04
我用QT4.5.2也编译不过去,问题:
文件myTextDraw.h中用了QTextFormat::CGTextUnderline、QTextItemUnderlineHint、QTextItemUnderlineHint......等QT的类,但是QT4的任何一个版本也没这些类的定义吧。
急等楼主解答。谢谢!
离线robertkun

只看该作者 10楼 发表于: 2010-01-04
引用第9楼dashanda于2010-01-04 17:38发表的  :
我用QT4.5.2也编译不过去,问题:
文件myTextDraw.h中用了QTextFormat::CGTextUnderline、QTextItemUnderlineHint、QTextItemUnderlineHint......等QT的类,但是QT4的任何一个版本也没这些类的定义吧。
急等楼主解答。谢谢!


对,这是为了实现对每个字进行自定义下划线的设置,所以更改了Qt的源码,添加了文字的这些属性,有兴趣的话,我可以把qt源码传上来。
                                              简单的生活使人快乐!
离线dashanda
只看该作者 11楼 发表于: 2010-01-04
楼主快把QTextFormat::CGTextUnderline、QTextItemUnderlineHint、QTextItemUnderlineHint......的实现代码传上来吧
代表大家致谢!
离线robertkun

只看该作者 12楼 发表于: 2010-01-05
以 4.4.3 为例,如果遇到QT本身没有的属性,想要自已添加时,

首先修改 qt\4.4.3\src\gui\text\qtextformat.h

在属性列表里面追加 新的属性

// ADD BEGIN BY Me

UserProperty = 0x100000,                       //定义属性的独立标识

CGTextUnderline      = UserProperty+1

// ADD BEGIN BY Me


然后修改 qt\4.4.3\src\gui\painting\qpaintengine.h

在paint里面追加一个结构体,如表示下划线的结构体,
包含下划线的是否可用,类型、高度、颜色等信息,
(其实下划本身也包含此类的信息,这里有其它的用途。)

// use to draw the text's underline
struct Q_GUI_EXPORT QTextItemUnderlineHint
{
    QTextItemUnderlineHint()
        : bEnabled(false)
        , nPosition(0)
        , nHeight(0)
    {}
    bool    bEnabled;            // underline enabled
    int        nStyle;                        // underline style
    int        nPosition;                // underline position
    int        nHeight;                        // underline height
    QBrush    cBrush;                        // underline brush
};
Q_DECLARE_METATYPE(QTextItemUnderlineHint);

这样一个下划线的自定义绘制就基本完成了。
剩下的就是在绘制的时候,取得这些信息就可以了。

个人感觉QT的一些限制还是比较多的,
如在QGraphicsTextItem 里面想改变光标的宽度,
还有在本例 字体二 中 ,用鼠标移动文本时,选中文本就会消失,

这些都是偶很头大的问题,
如果大家有什么好的方法,不妨拿出来晒晒。。。
描述:qtextformat.h,qpaintengine.h
附件: TextDemo.rar (10 K) 下载次数:38
                                              简单的生活使人快乐!
离线dashanda
只看该作者 13楼 发表于: 2010-01-05
楼主好厉害,太佩服你了。希望以后能给大家带来更多这样在别处学不到得知识。向知识博学,乐于奉献的楼主致谢!
离线robertkun

只看该作者 14楼 发表于: 2010-01-05
引用第13楼dashanda于2010-01-05 10:30发表的  :
楼主好厉害,太佩服你了。希望以后能给大家带来更多这样在别处学不到得知识。向知识博学,乐于奉献的楼主致谢!


知识博学这个真没有,乐于瞎摆活是真的。。
                                              简单的生活使人快乐!
离线lionyu
只看该作者 15楼 发表于: 2010-01-05
看了楼主的代码,想提问个问题:
例如 在你的程序中画了一个矩形,我拖动坐下角放大,鼠标拖动过程中,矩形的黄色虚线框式不随鼠标的移动实时显示的,请问怎样实时显示黄色虚线框,从而更符合视觉习惯?
离线lionyu
只看该作者 16楼 发表于: 2010-01-06
引用第15楼lionyu于2010-01-05 15:14发表的  :
看了楼主的代码,想提问个问题:
例如 在你的程序中画了一个矩形,我拖动坐下角放大,鼠标拖动过程中,矩形的黄色虚线框式不随鼠标的移动实时显示的,请问怎样实时显示黄色虚线框,从而更符合视觉习惯?


楼主在吗?能就这个问题给点建议吗?谢谢!
离线robertkun

只看该作者 17楼 发表于: 2010-01-06
引用第15楼lionyu于2010-01-05 15:14发表的  :
看了楼主的代码,想提问个问题:
例如 在你的程序中画了一个矩形,我拖动坐下角放大,鼠标拖动过程中,矩形的黄色虚线框式不随鼠标的移动实时显示的,请问怎样实时显示黄色虚线框,从而更符合视觉习惯?


虚线框不能实时显示是因为 它的大小超出了图元的BoundingRect(), 一种方法可以通过实时的改变图元的大小,解决这个问題。。

另外还有一种方法可以解决 图元的BoundingRect()问題,使得虚线框的拉伸不受限制,我是想用这种方法的,不过还没搞定。。
                                              简单的生活使人快乐!
离线lionyu
只看该作者 18楼 发表于: 2010-01-06
引用第17楼robertkun于2010-01-06 15:50发表的  :
虚线框不能实时显示是因为 它的大小超出了图元的BoundingRect(), 一种方法可以通过实时的改变图元的大小,解决这个问題。。
另外还有一种方法可以解决 图元的BoundingRect()问題,使得虚线框的拉伸不受限制,我是想用这种方法的,不过还没搞定。。



楼主你好:
方法一:实时改变图元的大小,怎么设计,是在myBaseElem类的 mousemove()事件中case下的语句用类似mouserealease()事件中case下的代码实现吗?但我试了,不行哩
方法二:解决BoundRect(),你指的是怎么做?
还有一个问题:例如在是缩小矩形时,向左上角拖动,当鼠标的移动坐标差变为负时,黄色的虚线框就不实时显示了,这个问题你感觉该怎么纠正啊?
离线openware
只看该作者 19楼 发表于: 2010-01-07
引用第10楼robertkun于2010-01-04 18:02发表的  :
对,这是为了实现对每个字进行自定义下划线的设置,所以更改了Qt的源码,添加了文字的这些属性,有兴趣的话,我可以把qt源码传上来。


干吗要改源码?继承不就可以了吗?
离线zuoyi

只看该作者 20楼 发表于: 2010-01-07
元旦大家同乐!嘿嘿...
学习Qt技术...
离线xlttap

只看该作者 21楼 发表于: 2010-01-11
just see see
我简单我快乐
离线robertkun

只看该作者 22楼 发表于: 2010-01-11
引用第19楼openware于2010-01-07 10:13发表的  :
干吗要改源码?继承不就可以了吗?


楼上说的有道理诶。。
                                              简单的生活使人快乐!
离线robertkun

只看该作者 23楼 发表于: 2010-02-05
引用第15楼lionyu于2010-01-05 15:14发表的  :
看了楼主的代码,想提问个问题:
例如 在你的程序中画了一个矩形,我拖动坐下角放大,鼠标拖动过程中,矩形的黄色虚线框式不随鼠标的移动实时显示的,请问怎样实时显示黄色虚线框,从而更符合视觉习惯?



最近发现,通过给 QGraphicsView 设置 setViewportUpdateMode(QGraphicsView::FullViewportUpdate);

可以实时地显示虚线框 。。
                                              简单的生活使人快乐!
离线zuoyi

只看该作者 24楼 发表于: 2010-03-19
学习Qt技术...
离线robertkun

只看该作者 25楼 发表于: 2010-06-21
回 楼主(robertkun) 的帖子
不知道有没有看过,FotoWall  真的很不错。。。
什么时候我也能达到那个水平呀。。。

修改了这个程序,是参考 FotoWall 的。ga ga ...
描述:New
附件: happyDraw.rar (111 K) 下载次数:69
                                              简单的生活使人快乐!
离线yleesun

只看该作者 26楼 发表于: 2010-06-28
增加了旋转功能,不错,值得借鉴!
离线xinqingfly

只看该作者 27楼 发表于: 2010-06-28
如何实现分层显示呢?
菜鸟也是鸟
离线i4455

只看该作者 28楼 发表于: 2010-12-27
学习学习 正需要呢
离线liuyuanan

只看该作者 29楼 发表于: 2012-10-19
支持楼主
快速回复
限100 字节
 
上一个 下一个