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,還不知道問題出在哪。