您的位置:首页 > Web前端 > CSS

Qlabel 自定义鼠标点击事件以及文本样式效果设计

2016-10-12 13:48 1486 查看
需要设计的效果是:

1、标题、内容以及图片均具有点击的效果;

2、鼠标放置在标题和内容上,文字变色并且高亮显示,无需下划线;

3、鼠标的形状:在放置在标题和内容上时由箭头变成小手指。

整个窗体采用QWidget类型,标题、内容、图片采用QLabel类型。当我实现文本点击时,发现QLabel没有像button那样的clicked信号,网上推荐了如下两种方法:

1、在标题中嵌入html标签:

     QString title = "href='www.baidu.com'>百度"

     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_OBJECT

public:

 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,还不知道问题出在哪。

 

原文地址:http://blog.csdn.net/kohaku/article/details/24551287
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐