去掉view項的焦點(diǎn)虛線框的方法memo
【51CTO編者按】我們曾經(jīng)介紹過如何定義Android View類,Qt中的View類,如QListView, 在其項被選中時會有一個焦點(diǎn)虛線框表示焦點(diǎn)的位置。 不知道為啥,這個焦點(diǎn)虛線框很不招人待見, 筆者至今已經(jīng)遇到多例想要去掉該虛線框的問題。
筆者能想到的有兩個方法, memo如下:
使用QItemDelegate子類
對QItemDelegate這個類筆者在此不多做討論, 詳情參考Qt文檔。 簡單來說,這個類可以控制view中的項的繪制方式,其中包括焦點(diǎn)虛線框的繪制。 而且焦點(diǎn)虛線框的繪制被封裝在一個虛函數(shù)中, 所以通過派生QItemDelegate就可以重新定義該函數(shù)的功能 — 如什么都不畫。 具體對應(yīng)的虛函數(shù)是:http://qt.nokia.com/doc/4.6/qitemdelegate.html#drawFocus
有了QItemDelegate的子類后,我們需要調(diào)用QAbstractItemView的setItemDelegate方法將我們的item delegate與view關(guān)聯(lián)。 這個itemdelegate可以為view全局有效,或針對某個item, 也可以調(diào)用setItemDelegateForRow/Column設(shè)置針對行或列有效的delegate。
使用QStyle子類
這個方法的作用原理和第一種方法基本一致, 因為QItemDelegate的drawFocus函數(shù)調(diào)用QStyle的drawPrimitive虛函數(shù)去做實際的繪制, 所以如果我們重新定義這個繪制過程能達(dá)到同樣的效果。 drawPrimitive函數(shù)負(fù)責(zé)繪制非?;镜慕缑嬖兀?根據(jù)傳入的參數(shù)判斷需要繪制的元素, 具體到本例就是要針對PE_FrameFocusRect元素做特殊處理。 例子代碼如下:
- class NoFocusRectangleStyle: public QCommonStyle
- {
- public:
- ...
- void NoFocusRectangleStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget) const
- {
- if (QStyle::PE_FrameFocusRect == element && widget && widget->inherits("QListWidget"))
- return;
- else
- QCommonStyle::drawPrimitive(element, option, painter,
- widget);
- }
- };
一般我們派生QStyle不會傻乎乎地去派生這個基本的基類, 更常見的是派生與我們需要的風(fēng)格最接近的類,一般是我們的程序默認(rèn)使用的類。 我們的派生類可能非常簡單, 只重寫drawPrimitive這么一個函數(shù), 幾行代碼搞定。 使用方法是調(diào)用QApplication::setStyle, 或者QWidget::setStyle, 前者將style效果應(yīng)用到程序中的所有窗體,后者將效果限制在當(dāng)前窗體。
小小memo, 希望對廣大Qter有所幫助。 如果大家有其他方法歡迎留言。
【編輯推薦】
- Qt程序進(jìn)入等待睡眠的正確方法
- Qt開發(fā):釋放線程中創(chuàng)建的QUdpSocket對象
- QTreeWidget設(shè)計解決沒有拖動項問題
- 在QT SDK下構(gòu)建MeeGo Touch開發(fā)環(huán)境
- QtCreator:MeeGo開發(fā)程序入門手冊
原文地址:http://www.cuteqt.com/blog/?p=2008