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. }



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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • js动画和css3动画_js控制css动画

    js动画和css3动画_js控制css动画动画css动画js动画css动画js动画

    2022年10月15日
    3
  • 利用matlab画三维图像_使用变身卡进行擂台切磋

    利用matlab画三维图像_使用变身卡进行擂台切磋使用MATLAB进行三维图像绘制

    2022年10月11日
    3
  • 五大常用算法之四:回溯法

    1、概念回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标

    2021年12月25日
    42
  • 2020年公认最快的dns(国内好用的dns)

    简介:2020国内速度最快的dns推荐原版周公解梦分析梦见儿子死了的吉凶境遇安全,推荐长辈惠泽,推荐承受父祖之余德,前辈之提拔,而得大成功及发展,原命若喜水木者更佳。若凶数者:成又转败,陷于离乱变动,至晚年终归孤独失败,又早年有落水灾遇,生涯九死一生之命格。国内又须戒色变及刀杀之危。梦到蛇和蛇一头,速度暗示你可能会受到别人的欺骗,或受到别人欺骗。最快梦见蛇的心理学解梦从做梦内容的本义来说:推荐动物…

    2022年4月13日
    202
  • 屏幕尺寸、分辨率、像素密度及其三者之间的关系[通俗易懂]

    屏幕尺寸、分辨率、像素密度及其三者之间的关系[通俗易懂]屏幕尺寸屏幕对角线的长度单位英寸,1英寸等于2.54厘米分辨率横纵向方向像素的大小纵向像素*横向像素,如1920px*1080px单位像素(px)像素密度指每英寸屏幕所拥有的像素的数量单位dpi三者关系像素密度=Sqrt(横向像素*横向像素+纵向像素*纵向像素)/屏幕尺寸注意:像素大小并不是固定的,不同的设备像素的大小可能不相同

    2022年5月30日
    60
  • 电信光猫改桥接还在苦苦激活成功教程超级密码吗?

    电信光猫改桥接还在苦苦激活成功教程超级密码吗?电信光猫路由改桥接,不同的地区有不通的方法。比较幸运的地区和终端,有通用的超级密码。但是不幸的地区,就需要通过激活成功教程这个超级密码。我就属于比较不幸的地区,遇到不幸的终端:天翼网关TEWA-708G。然后按照网上大神的激活成功教程方法:先是普通用户登录,然后通过备份的方式,将备份文件考出,再通过电脑上的网页源码查看软件找到超级用户的密码。里面当然也有宽带的用户名和密码。通过多方努力,我成功了。然后开心的准备给家里买个新的路由器,准备换上。这中间大概隔了一两周的时间。悲剧发生了。。。。。。光猫的版本升级了,这个漏洞被电信

    2022年10月8日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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