Qt-Qlabel 自定义鼠标点击事件以及文本样式效果设计
来源:互联网 发布:淘宝货到付款卖家 编辑:程序博客网 时间:2024/06/11 06:17
最近项目中需要实现一个消息推送的功能,模仿QQ消息弹窗的方式实现,界面开发的工具为Qt。对桌面应用开发这块不太熟悉,通过摸索尝试也算是把这个功能实现了,其中也碰到了一些比较麻烦的问题,这些问题我看也具有一定的普遍性,就把我摸索出来的解决方法和大家分享下(可能有更好的方法我没想到)!
Qt虽说支持CSS2的所有样式效果,但真正实现起来可并不如html那般简单。这个消息弹窗中的文字链接以及点击效果的设置就把我折腾了好久。需要设计的效果是:
1、标题、内容以及图片均具有点击的效果;
2、鼠标放置在标题和内容上,文字变色并且高亮显示,无需下划线;
3、鼠标的形状:在放置在标题和内容上时由箭头变成小手指。
整个窗体采用QWidget类型,标题、内容、图片采用QLabel类型。当我实现文本点击时,发现QLabel没有像button那样的clicked信号,网上推荐了如下两种方法:
1、在标题中嵌入html标签:
QString title = "<a href=' " + url + " '>" + content + " </a>
ui.Title->setText(title)
setOpenExternalLinks(true) // 允许打开外部链接,这个可在ui文件中通过可视化工具设置(我用的是VS插件Qt设计师)
但这种方式存在两个个问题:1)无法支持鼠标hover效果;2)它会继承html超链接的内部样式:blue underline。
我试图在qss文件中设置样式,但无法改变其内置样式。也可以在a标签中直接设置style样式,但这只能解决第二个问题。
2、自定义实现QLabel以及clicked 信号,然后通过qss设置QLabel的文本样式以及hover效果:
1)自定义QLabel:
class ActivityLabel : public QLabel{Q_OBJECTpublic:ActivityLabel(QWidget * parent = 0);~ActivityLabel(void);protected:void mouseReleaseEvent(QMouseEvent * ev);signals: void clicked(); };
void ActivitiLabel::mouseReleaseEvent(QMouseEvent * ev) {//定义鼠标左键点击事件 if(ev->button() == Qt::LeftButton){Q_UNUSED(ev) emit clicked();}}
并将ui文件中的控件类型设置为自定义的QLabel类型,这样就解决QLabel不支持clicked事件的问题。
2)在qss中设置title的文本样式和hover效果
QLabel#Title{ background-image: url(:/ActivitiForm/Resources/act_content_bg.png); font: bold 13px "微软雅黑"; color: black;}QLabel#Title:hover{ color:blue;}
3)定义与clicked信号对应的槽:
void ActivitiForm::onDetailClicked(){ QUrl url(activiti->getPageLink()); QDesktopServices::openUrl(url);}
connect(ui.Title,SIGNAL(clicked()),this,SLOT(onDetailClicked()));
4)设置QLabel控件的鼠标形状:
Title->setCursor(QCursor(Qt::PointingHandCursor));
或者通过qt设计师设置:
5)设置自动换行显示:
ui.Content->setText(content);ui.Content->adjustSize();
注意这两条代码的顺序。
除了换行,我们还需要设置Content框的大小:长的大小固定,宽可以任何调整,具体设置如下:
QSizePolicy sizePolicy1(QSizePolicy::Preferred, QSizePolicy::Preferred); sizePolicy1.setHorizontalStretch(0); sizePolicy1.setVerticalStretch(20); sizePolicy1.setHeightForWidth(Content->sizePolicy().hasHeightForWidth());
Content->setSizePolicy(sizePolicy1); Content->setMinimumSize(QSize(121, 0)); Content->setMaximumSize(QSize(121, 90));
6)QLabel中中文乱码的处理:
QByteArray content = reply_->readAll(); //读取网络字节流QTextCodec *codec = QTextCodec::codecForLocale(); //将编码方式设置成本地编码方式QString contentQStr = codec->toUnicode(content); //使用编码器进行转码
注:当时有将codec强行设置成gbk的编码方式,但程序运行后发现bug,还不知道问题出在哪。
- Qlabel 自定义鼠标点击事件以及文本样式效果设计
- Qt-Qlabel 自定义鼠标点击事件以及文本样式效果设计
- qt自定义鼠标单击事件标签QLabel
- Qt自定义控件---QLabel点击事件
- QLabel响应鼠标点击事件
- Qt 中自定义QLabel上的点击事件
- QT自定义鼠标样式
- qt qlabel 样式
- QT鼠标点击响应事件
- Qt 处理鼠标点击事件
- Qt鼠标事件 我的鼠标样式
- QT QLabel 单击事件
- Qt为QLabel添加点击事件-使QLabel成为一个图片按钮
- 为QLabel添加鼠标事件
- UILabel点击调用电话以及邮箱,UILabel超链接效果 NSMutableAttributedString文本样式设置
- Qt动画之鼠标水滴点击效果
- 自定义图形以及点击效果
- QT中模拟鼠标点击事件
- 聆听沉默 (愿与君共勉)
- 工程思维与中国人情社会 (一)
- 桥接模式
- 02-08格式检查
- Pat(Advanced Level)Practice--1042(Shuffling Machine)
- Qt-Qlabel 自定义鼠标点击事件以及文本样式效果设计
- Windows/Ubuntu下Eclipse的AVD不能启动解决技巧
- 1879: Intersection
- js异步加载的三种解决方案
- 实验十六_编写包含多个功能子程序的中断例程
- java.net 类 URL
- ios第三档库
- Linux 命令详解 -- join
- linux安装rar