zoukankan      html  css  js  c++  java
  • QT学习笔记-33.QTableView增加QCheckBox的方法

    http://www.cppblog.com/gaimor/archive/2011/11/26/160993.html

    使用Delegate具体如下:

    class QLineDelegate : public QStyledItemDelegate
    {
        Q_OBJECT
    public:
        QLineDelegate(QTableView* tableView);
    protected:
        void paint(QPainter* painter,const QStyleOptionViewItem& option,const QModelIndex& index) const;
        bool editorEvent(QEvent *event,
                                             QAbstractItemModel *model,
                                             const QStyleOptionViewItem &option,
                                             const QModelIndex &index) ;
    private:
        QPen         pen;
        QTableView*  view;
    };
    static QRect CheckBoxRect(const QStyleOptionViewItem &view_item_style_options)
    {
        QStyleOptionButton check_box_style_option;
        QRect check_box_rect = QApplication::style()->subElementRect(
            QStyle::SE_CheckBoxIndicator,
            &check_box_style_option);

        QPoint check_box_point(view_item_style_options.rect.x() +
                               view_item_style_options.rect.width() / 2 -
                               check_box_rect.width() / 2,
                               view_item_style_options.rect.y() +
                               view_item_style_options.rect.height() / 2 -
                               check_box_rect.height() / 2);
        return QRect(check_box_point, check_box_rect.size());
    }


    QLineDelegate::QLineDelegate(QTableView* tableView)
    {
        int gridHint = tableView->style()->styleHint(QStyle::SH_Table_GridLineColor, new QStyleOptionViewItemV4());
        QColor gridColor = static_cast<QRgb>(gridHint);
        pen = QPen(gridColor,0,tableView->gridStyle());
        view = tableView;
    }

    void QLineDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option,const QModelIndex& index)const
    {
        bool checked = index.model()->data(index, Qt::DisplayRole).toBool();

        if(index.column() == 0)
        {
            QStyleOptionButton check_box_style_option;
            check_box_style_option.state |= QStyle::State_Enabled;
            if(checked)
            {
                check_box_style_option.state |= QStyle::State_On;
            }
            else
            {
                check_box_style_option.state |= QStyle::State_Off;
            }
            check_box_style_option.rect = CheckBoxRect(option);
            QApplication::style()->drawControl(QStyle::CE_CheckBox,&check_box_style_option,painter);
        }

        QStyledItemDelegate::paint(painter,option,index);
        QStyleOptionViewItem itemOption(option);
        if(itemOption.state & QStyle::State_HasFocus)
            itemOption.state = itemOption.state ^ QStyle::State_HasFocus;
        QStyledItemDelegate::paint(painter,itemOption,index);
        QPen oldPen = painter->pen();
        painter->setPen(pen);
        painter->drawLine(option.rect.topRight(),option.rect.bottomRight());
        painter->drawLine(itemOption.rect.bottomLeft(),itemOption.rect.bottomRight());
        painter->setPen(oldPen);
    }

    bool QLineDelegate::editorEvent(QEvent *event,
                                       QAbstractItemModel *model,
                                       const QStyleOptionViewItem &option,
                                       const QModelIndex &index) {
        if((event->type() == QEvent::MouseButtonRelease) ||
            (event->type() == QEvent::MouseButtonDblClick))
        {
            QMouseEvent *mouse_event = static_cast<QMouseEvent*>(event);
            if(mouse_event->button() != Qt::LeftButton ||
               !CheckBoxRect(option).contains(mouse_event->pos()))
            {
                return false;
            }

            if(event->type() == QEvent::MouseButtonDblClick)
            {
                return true;
            }
        }
        else if(event->type() == QEvent::KeyPress)
        {
            if(static_cast<QKeyEvent*>(event)->key() != Qt::Key_Space &&
               static_cast<QKeyEvent*>(event)->key() != Qt::Key_Select)
            {
                return false;
            }
        }
        else
        {
            return false;
        }

        bool checked = index.model()->data(index, Qt::DisplayRole).toBool();
        return model->setData(index, !checked, Qt::EditRole);
    }

    不过有一个小问题,就是CheckBox旁边有false/true字符

  • 相关阅读:
    java中this关键字
    java继承
    java super关键字
    java String类型存储详解
    java四种访问权限修饰符
    C/C++语言void及void指针深层探索【转】
    Linux Epoll介绍和程序实例【转】http://blog.csdn.net/sparkliang/article/details/4770655
    服务器与wp7的socket通信【转】 http://www.cnblogs.com/linzheng/archive/2011/06/21/2086456.html
    android关于socket编程,以聊天为例【转】http://hi.baidu.com/yaoyuanhuajx/item/9b93d7565f315ba9acc857d7
    Tesseract 3 语言数据的训练方法【转】http://blog.csdn.net/dragoo1/article/details/8439373
  • 原文地址:https://www.cnblogs.com/Vancamel/p/11218241.html
Copyright © 2011-2022 走看看