Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 逐行绘制矩形不需要';I don’直接画出来的结果不一样_Qt_Qtableview - Fatal编程技术网

Qt 逐行绘制矩形不需要';I don’直接画出来的结果不一样

Qt 逐行绘制矩形不需要';I don’直接画出来的结果不一样,qt,qtableview,Qt,Qtableview,我试图在(自定义)QTableView中自定义单元格的边框。为此,我发现: 这很有效。我在我的委托中添加了这一点-该委托已经有了一个用于其他事情的自定义paint方法,它完全满足了我的要求: 整洁 当我想要决定我到底画了什么边界时,事情开始变得混乱起来。为此,每个项都有一个BorderOption属性,该属性描述应该绘制哪些边框。我的网格不再是1px大了 因此,我决定尝试以下方法: painter->drawLine(option.rect.topLeft(), option.rect.

我试图在(自定义)
QTableView
中自定义单元格的边框。为此,我发现:

这很有效。我在我的委托中添加了这一点-该委托已经有了一个用于其他事情的自定义
paint
方法,它完全满足了我的要求:

整洁

当我想要决定我到底画了什么边界时,事情开始变得混乱起来。为此,每个项都有一个
BorderOption
属性,该属性描述应该绘制哪些边框。我的网格不再是1px大了

因此,我决定尝试以下方法:

painter->drawLine(option.rect.topLeft(), option.rect.topRight());
painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());
哪个应该有相同的结果,对吗?对吗?好。。。没有

似乎正在绘制两条1px宽的线,每个单元一条

如果细胞的矩形没有重叠,这可能是有道理的。但我们之前看到的情况并非如此,因为第一个示例工作并生成了宽度为1px的矩形

我做错什么了吗


谢谢

您是否尝试手动设置笔的厚度

painter->setPen(QPen(QColor(255, 0, 0), 3, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
painter->drawLine(option.rect.topLeft(), option.rect.topRight());
painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());

这里,我将厚度设置为3px,例如

我认为对
option.rect
的含义存在误解。它实际上是表项的矩形。还有一部分,一个像素宽的线,不属于项的
选项.rect
,而是属于
QTreeView
本身

如果通过设置
setClipRect
并使用不同的颜色区分线条,将图形限制在允许的项目部分,这将变得更加明显

尝试使用绘制线的宽度以及启用和禁用“剪辑矩形”(clip rect)。也许你需要画出允许的<代码>选项.Rec/Cuth>,但是要注意在不同的平台上也要考虑不同代码的<代码> QTreVIEW ,其中分隔线可能比一个像素宽或宽0px。
#pragma once

#include <QStyledItemDelegate>
#include <QItemSelectionModel>
#include <QPainter>
#include <QDebug>

class MyDelegate : public QStyledItemDelegate {
public:

    MyDelegate(QObject* parent=nullptr) : QStyledItemDelegate(parent) { }
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const {

        QStyledItemDelegate::paint(painter, option, index);
        if (true) {
            painter->save();
            auto color=QColor::fromHsv((30*index.row() + 30 * index.column()) % 255, 255, 127);
            painter->setPen(QPen(color, 1, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
            painter->setClipRect(option.rect); // Rectangle of the item

            painter->drawLine(option.rect.topLeft(), option.rect.topRight());
            painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());
            painter->restore();
        }
    }
};
#pragma一次
#包括
#包括
#包括
#包括
类MyDelegate:公共QStyledItemDelegate{
公众:
MyDelegate(QObject*parent=nullptr):QStyledItemDelegate(parent){}
无效绘制(QPainter*painter,常数QStyleOptionViewItem&option,常数QModelIndex&index)常数{
QStyledItemDelegate::paint(油漆工、选项、索引);
如果(真){
画师->保存();
auto color=QColor::fromHsv((30*index.row()+30*index.column())%255、255、127);
painter->setPen(QPen(颜色,1,Qt::SolidLine,Qt::SquareCap,Qt::BevelJoin));
painter->setClipRect(option.rect);//项目的矩形
画师->绘图线(option.rect.toplight(),option.rect.toplight());
painter->drawine(option.rect.bottomLeft(),option.rect.bottomRight());
画师->还原();
}
}
};

如果为每行绘制上边框和下边框,则绘制同一条线两次:第一行的下边框是第二行的上边框。如果你认为每行之间有一个像素,那么你将有一个边框1像素,我不应该在每行之间有一个像素:第一个版本(它直接画矩形)没有问题,并且使用和我一样的数据。是的,我有,这不是问题。仅绘制两条线中的一条线可生成1px宽的线。
#pragma once

#include <QStyledItemDelegate>
#include <QItemSelectionModel>
#include <QPainter>
#include <QDebug>

class MyDelegate : public QStyledItemDelegate {
public:

    MyDelegate(QObject* parent=nullptr) : QStyledItemDelegate(parent) { }
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const {

        QStyledItemDelegate::paint(painter, option, index);
        if (true) {
            painter->save();
            auto color=QColor::fromHsv((30*index.row() + 30 * index.column()) % 255, 255, 127);
            painter->setPen(QPen(color, 1, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
            painter->setClipRect(option.rect); // Rectangle of the item

            painter->drawLine(option.rect.topLeft(), option.rect.topRight());
            painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());
            painter->restore();
        }
    }
};