QTreeview custom

QTreeview custom设定字体virtualQVariantMyModel::data(constQModelIndex&index,introle)const{if(index.isValid()&&role==Qt::ForegroundRole){if(index.column()==2){

大家好,又见面了,我是你们的朋友全栈君。设定字体

virtual QVariant MyModel::data( const QModelIndex &index, int role ) const
{
    if ( index.isValid() && role == Qt::ForegroundRole )
    {
        if ( index.column() == 2 )
        {
            return QVariant( QColor( Qt::red ) );
        }
        return QVariant( QColor( Qt::black ) );
    }

    return QAbstractItemModel::data( index, role );
}


显示图标

QVariant QTreeModel::data(const QModelIndex& index, int role) const
{
if (role == Qt::DecorationRole.)
{
// return QVariant();
return QIcon("act.png");
}
QTreeNode* node = nodeFromIndex(index);

if (node == 0)
return QVariant();

if (index.column() == 0) {
return node->name();
}

return QVariant();
}


//

设置行背景图, 以及Branch图片

      iCustomTree->setStyleSheet(   \

        “QTreeView { \

            show-decoration-selected: 1; \

        } \

        \

        QTreeView::item { \

            border: none; \

            background-image: url(images/list_bg01.png); \

        } \

        \

QTreeView::branch:closed:has-children:has-siblings { \

        image: url(images/icon_add.png); \

} \

 \

QTreeView::branch:has-children:!has-siblings:closed { \

        image: url(images/icon_add.png); \

} \

 \

QTreeView::branch:open:has-children:has-siblings { \

        image: url(images/icon_reduce.png); \

} \

 \

QTreeView::branch:open:has-children:!has-siblings { \

        image: url(images/icon_reduce.png); \

} \

“);

/

class ListViewDelegate : public QStyledItemDelegate { 
    protected:     void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const     { 
            QStyleOptionViewItemV4 opt = option;         initStyleOption(&opt, index);         QString line0 = index.model()->data(index.model()->index(index.row(), 1)).toString();         QString line1 = index.model()->data(index.model()->index(index.row(), 2)).toString();         // draw correct background         opt.text = "";         QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();         style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget);         QRect rect = opt.rect;         QPalette::ColorGroup cg = opt.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled;         if (cg == QPalette::Normal && !(opt.state & QStyle::State_Active))             cg = QPalette::Inactive;         // set pen color         if (opt.state & QStyle::State_Selected)             painter->setPen(opt.palette.color(cg, QPalette::HighlightedText));         else             painter->setPen(opt.palette.color(cg, QPalette::Text));         // draw 2 lines of text         painter->drawText(QRect(rect.left(), rect.top(), rect.width(), rect.height()/2),                           opt.displayAlignment, line0);         painter->drawText(QRect(rect.left(), rect.top()+rect.height()/2, rect.width(), rect.height()/2),                           opt.displayAlignment, line1);     }     QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index ) const     { 
            QSize result = QStyledItemDelegate::sizeHint(option, index);         result.setHeight(result.height()*2);         return result;     } }; 

  
  
  
  1. class MyDelegate : public QItemDelegate
  2. {
  3. protected :
  4. void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const;
  5. };
  6.  
  7. void MyDelegate :: paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
  8. {
  9. QStyleOptionViewItem itemOption (option );
  10.  
  11. if (itemOption. state & QStyle :: State_HasFocus )
  12. {
  13. qDebug ( "FOCUS" );
  14. itemOption. state ^= QStyle :: State_HasFocus;
  15. }
  16.  
  17. QItemDelegate :: paint (painter, itemOption, index );
  18. }

  
  
  
  1. void Style :: drawControl (ControlElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget ) const
  2. {
  3. if (element == CE_ItemViewItem )
  4. {
  5. const QStyleOptionViewItem *b = qstyleoption_cast<const QStyleOptionViewItem *> (option );
  6.  
  7. if (btn )
  8. {
  9. if (btn ->state & State_HasFocus )
  10. {
  11. btn ->state = btn ->state ^ State_HasFocus;
  12. }
  13. }
  14.  
  15. QWindowsStyle :: drawControl (element, btn, painter, widget );
  16.  
  17. }
  18. else
  19. {
  20. QWindowsStyle :: drawControl (element, option, painter, widget );
  21. }
  22. }

 using a QTreeView and a QItemDelegate to reimplement most of the paint routine.

the expand/collapse buttons and the sibling/child lines are drawn automatically by some other paint routine.

Qt draws a QTreeView item in this order:

[Expand button] — [Checkbox] — [Rest of treeitem stuff]

I want to draw it in this order:

[Checkbox] — [Expand button] — [Rest of treeitem stuff]

You can change those using a style sheet. This is from the Customizing QTreeView example in the style sheet reference:

QTreeView::branch:has-siblings:!adjoins-item {

     border-image: url(vline.png) 0;
 }

 QTreeView::branch:has-siblings:adjoins-item {

     border-image: url(branch-more.png) 0;
 }

 QTreeView::branch:!has-children:!has-siblings:adjoins-item {

     border-image: url(branch-end.png) 0;
 }

 QTreeView::branch:has-children:!has-siblings:closed,
 QTreeView::branch:closed:has-children:has-siblings {

         border-image: none;
         image: url(branch-closed.png);
 }

 QTreeView::branch:open:has-children:!has-siblings,
 QTreeView::branch:open:has-children:has-siblings  {

         border-image: none;
         image: url(branch-open.png);
 }

where the png filenames are the images you want to use.

The rows are painted by QTreeView.drawRow, the branches and expand icons are drawn in drawBranches.

定制树形视图。

可通过重写QTreeView的虚拟方法(drawRow()drawBranches())来定制。

QStyledItemDelegate – Styling Item views

It all started as a small feature request – Adding style sheet support for Item views. I quickly found out that our default delegate, QItemDelegate, doesn’t use QStyle the way it is supposed to. Jens had faced the same problem when trying to provide native look and feel for Vista and ended up writing his own delegate. This is quite a limitation because currently authors of custom QStyles can customize the look of everything in Qt except item views.

So was born QStyledItemDelegate – The default delegate for Item views starting 4.4. To let that sink in – all our views now delegate painting to QStyledItemDelegate instead of QItemDelegate. QStyledItemDelegate prompty plays its part by delegating everything to QStyle -) The cool thing is that this delegate uses the QStyle to determine the sizeHint, the layout of the text, indicators and icon. And of course, it paints everything through QStyle. Complete control to QStyle.

Jens has already incorporated this new feature into QWindowsVistaStyle. So, by default, your views will look all fancy in 4.4 like below:

vistatree2.png

We are unsure about how selection in table view must be handled. We are open to suggestions:

Chart example in vista style

On other platforms, they should exactly like before. If you had written your own delegate using QItemDelegate, it is completely unaffected by this change. If having to write a custom QStyle or a custom delegate sounds daunting, just use style sheets. Try something like this,

QTreeView::item {
    border: 1px solid #d9d9d9;
    border-top-color: transparent;
    border-bottom-color: transparent;
}

QTreeView::item:hover {
    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #e7effd, stop: 1 #cbdaf1);
    border: 1px solid #bfcde4;
}

QTreeView::item:selected {
    border: 1px solid #567dbc;
}

QTreeView::item:selected:active{
    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6ea1f1, stop: 1 #567dbc);
}

QTreeView::item:selected:!active {
    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6b9be8, stop: 1 #577fbf);
}

Here’s how it looks:

stylesheet-treeview.png

See Customizing QTreeView, Customizing QListView for more information.

We merged the new delegate into our main branch last week, so if use the latest snapshots, you already have it. If you have any specific requirements to styling of tree widgets, list views and tables in mind and are wondering if it is possible now using the new delegate, please leave behind a note!

the QTreeView doesn’t draw the branch indicator itself but passes required information to the current style to draw it. It’s up to the style to decide the color… Anyway, QCommonStyle uses the pen color directly so you could even do it like this:
Qt Code:

  
  
  
  1. #include <QtGui>
  2.  
  3. // NOTE: you may use the ProxyStyle is available at Qt Centre wiki but make it inherit QCommonStyle instead of QStyle
  4. #include "proxystyle.h"
  5.  
  6. class MyProxyStyle : public ProxyStyle
  7. {
  8. public :
  9. explicit MyProxyStyle ( const QString & baseStyle ) : ProxyStyle (baseStyle )
  10. {
  11. }
  12.  
  13. void drawPrimitive (PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget = 0 ) const
  14. {
  15. if (element == QStyle :: PE_IndicatorBranch )
  16. {
  17. painter ->save ( );
  18. painter ->setPen ( QPen (Qt :: blue, 1, Qt :: DashLine ) );
  19. QCommonStyle :: drawPrimitive (element, option, painter, widget );
  20. painter ->restore ( );
  21. }
  22. ProxyStyle :: drawPrimitive (element, option, painter, widget );
  23. }
  24. };
  25.  
  26. int main ( int argc, char * argv [ ] )
  27. {
  28. QApplication app (argc, argv );
  29. QTreeWidget tree;
  30. tree. setStyle ( new MyProxyStyle (app. style ( ) ->objectName ( ) ) );
  31. for ( int i = 0; i < 10; ++i )
  32. new QTreeWidgetItem ( &tree, QStringList ( ) << QString :: number (i ) );
  33. tree. show ( );
  34. return app. exec ( );
  35. }



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/143000.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • preference用法for_interference用法

    preference用法for_interference用法文章目录PreferenceFragment简介PreferenceFragment使用PreferenceFragment扩展PreferenceFragment简介在我们写一个项目的时候,基本都有选项设置界面,这类设置界面的原理基本都是本地的一些个性化设置,通过读取本地设置来改变某些差异显示(例如字体大小,主题颜色,WIFI自动下载等)。这些设置一般都会使用Preference来保存,…

  • Java 多线程(超详细)

    Java 多线程(超详细)多线程学习思路:为什么学习线程?为了解决CPU利用率问题,提高CPU利用率。=》什么是进程?什么是线程?=》怎么创建线程?有哪几种方式?有什么特点?=》分别怎么启动线程?=》多线程带来了数据安全问题,该怎么解决?=》怎么使用synchronized(同步)决解?=》使用同步可能会产生死锁,该怎么决解?=》线程之间是如何通信的?=》线程有返回值吗?该如何拿到?=》怎么才能一次性启动几百上千个的线程?线程的概念什么是进程进程是操作系统中正在执行的不同的应用程序,例如:我

  • 判断一个点是否在某个区域内。百度,高德,腾讯都能用。(php版)

    判断一个点是否在某个区域内。百度,高德,腾讯都能用。(php版)

  • 激活成功教程资料大全「建议收藏」

    激活成功教程资料大全「建议收藏」激活成功教程资料大全顶啊!!! DFCG官方论坛http://www.chinadfcg.com/龙族联盟论坛http://www.chinadforce.com/index.php中国狂热激活成功教程联盟-梦想家园社区http://www.5icrack.com/bbs/index.php风飘雪|加密与解密实战攻略|最酷激活成功教程教学,带你轻松进入激活成功教程的殿堂http://www.hx007.com/f

  • 网页升级中每天自动更新什么意思_快照搜索

    网页升级中每天自动更新什么意思_快照搜索网站被收录是百度蜘蛛爬行、记录、筛选的结果。网站被爬行后会在搜索引擎数据库中留下数据,当判断收录的内容达到用户要求质量时,网站的快照才会被释放出来,而快照的时候很多时候都是最初的爬行时间。这也是我们很多站长发现被收录后,快照时间不是当天时间的原因了。  在我们的认知中,每次百度快照的更新都是搜素引擎对网站数据的一次爬行收录过程,也就意味着更新就会带来网站排名的微调动。所以,更多时候

  • 线程池不使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式[通俗易懂]

    线程池不使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号