Qt-QTreeView自定义树控件
在做中大型项目时,可能又成百上千个功能界面,而这些功能界面无非就是数据的输入与输出,那么对常用的控件进行定制是非常重要的。本人认为Qt的原生控件使用起来有以下几点问题:
1、 Qt控件为了兼容各种情况,设计得是比较抽象的,对于新员工来说理解起来比较困难,接口调用也复杂;
2、 不同的人对代码理解不同,Qt的控件用起来也是各显神通,后期维护起来非常困难;
3、 每个公司的产品有自己的外观风格,定制控件可以同一实现外观,无需开发人员自己处理。
可能刚刚看感觉比想象中的复杂一点,但是只要多看几遍就会清楚为什么Qt的控件要这样设计,项绘制部分参考了网上的代码。
主要自定义两个类,CustomTree和CustomTreeItemDelegate,类关系如下图:
核心代码:
void CustomTreeDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
painter->setRenderHint(QPainter::Antialiasing);
//绘制背景
QColor colorBg;
if (option.state & QStyle::State_Selected)
{
colorBg = m_view->checkedBgColor();
}
else if (option.state & QStyle::State_MouseOver)
{
colorBg = m_view->hoverBgColor();
}
else
{
colorBg = m_view->bgColor();
}
QRect bgRect(0, option.rect.top(), m_view->width(), option.rect.height()); // 直接用option.rect,二级树左边有空白
painter->fillRect(bgRect, colorBg);
// 绘制checked状态的item的右侧三角形
if (option.state & QStyle::State_Selected)
{
painter->setPen(Qt::NoPen);
painter->setBrush(m_view->checkedTextColor());
QVector<QPointF> points;
points.append(QPointF(option.rect.right(), option.rect.top() + option.rect.height() * 0.3));
points.append(QPointF(option.rect.right(), option.rect.top() + option.rect.height() * 0.7));
points.append(QPointF(option.rect.right() - option.rect.height() * 0.3, option.rect