Qlabel 自定義鼠標點擊事件以及文本樣式效果設計

需要設計的效果是:

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

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