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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • rabbit mq使用_rabbitmq部署

    rabbit mq使用_rabbitmq部署原文转载:http://blog.csdn.net/whycold/article/details/41119807推荐文章:SpringBoot+RabbitMq的使用一、简介MQ全称为MessageQueue,消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息…

    2022年10月3日
    2
  • jquery checkbox 选中方法「建议收藏」

    jquery checkbox 选中方法「建议收藏」方法一:if($(“#checkbox-id”)get(0).checked){//dosomething}方法二:最佳if($(‘#checkbox-id’).is(‘:checked’)){//dosomething}方法三:if($(‘#checkbox-id’).attr(‘checked’)){//dos

    2022年7月15日
    18
  • php工厂模式使用场景[通俗易懂]

    php工厂模式使用场景[通俗易懂]场景:使用工厂模式接入:阿里短信验证、腾讯短信验证、百度短信验证创建类文件BaseSMS.php–基础短信服务接口类AliSMS.php–阿里短信服务类BaiduSMS.php–百度短信服务类TencentSMS.php–腾讯短信服务类SmsBusiness.php–短信业务逻辑类具体代码BaseSMS.php–基础短信服务接口类interfaceBaseSMS{publicstaticfunctionsendCode($phone,$co

    2022年7月25日
    23
  • Centos7安装jq

    Centos7安装jq

    2021年5月14日
    152
  • linux常用命令csdn_linux的rename命令

    linux常用命令csdn_linux的rename命令一.基础知识1.1liunx系统的文件结构/dev设备文件/etc大多数配置文件/home普通用户的家目录/lib32位函数库/lib6464位库/media手动临时挂载点/mnt手动临时挂载点/opt第三方软件安装位置/proc进程信息及硬件信息/root临时设备的默认挂载点/sbin系统管理命令/srv

    2025年11月10日
    7
  • Python使用py2exe打包exe程序[通俗易懂]

    Python使用py2exe打包exe程序[通俗易懂]py2exe可以将Python程序打包成exe程序,使得可以在没有Python环境的机器上运行。

    2025年10月22日
    3

发表回复

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

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