首页 > 解决方案 > 如何根据近列单元格中的数据在 QTableView 的列内绘制不同的线?

问题描述

我想在列内画线,显示不同信号之间的可能连接(此外,我还想在它们上制作单选按钮以选择哪些连接处于活动状态)。

但是现在我遇到了麻烦,代表只允许我为所有列或所有行设置 SetItemDelegate。所以我不能只制作这条线的不同块,如垂直线、角线、水平线,然后根据单元格中的数据绘制它们。我附上了一个示例图像。我应该用什么来画这样的东西?

就像是:

定义新样式,覆盖drawPrimitive 方法并进行自定义绘画?

请给我举个例子好吗?

线条示例

我现在拥有的

我用信号创建行的主要代码(我现在从 .txt 文件中获取它们进行模拟):

       int IPFilesize = IPfilespl.size();
   ui->CompTab->setRowCount(IPFilesize);

   for (int i = 0; i<IPFilesize; i++)
       {
           QWidget *ChBx = new QWidget();
           QCheckBox *pCheckBox = new QCheckBox();
           QHBoxLayout *pLayout = new QHBoxLayout(ChBx);
           pLayout->addWidget(pCheckBox);
           pLayout->setAlignment(Qt::AlignCenter);
           pLayout->setContentsMargins(0,0,0,0);
           ChBx->setLayout(pLayout);
           ui->CompTab->setCellWidget(i, 0, ChBx);
           //connect(ChBx,SIGNAL(clicked()),this,SLOT(checkboxClicked()));
       }

   for (int ii = 0; ii<IPFilesize; ii++)
       {
           ui->CompTab->setItem(ii, 2, new QTableWidgetItem(IPfilespl.at(ii)) );
           //connect(ChBx,SIGNAL(clicked()),this,SLOT(checkboxClicked()));
       }
   ui->CompTab->setItemDelegateForColumn(1, new WireDelegateDown());

标头代码

class WireDelegate: public QStyledItemDelegate { protected:  void paint(QPainter* painter, const QStyleOptionViewItem& opt, const QModelIndex& index) const {

int x = opt.rect.x();
double y = opt.rect.y();
QPoint c = opt.rect.center();
double centerx = c.x();
double centery = c.y();
double r = opt.rect.right();
double width = opt.rect.width();
double height = opt.rect.height();
QPainterPath path;
path.addRect(centerx, centery-height/2, 5.0, height/2);
path.moveTo(0, 0);
path.addRect(centerx, centery, width/2, 5.0);
path = path.simplified();
painter->drawPath(path);

标签: c++qt

解决方案


您可能会考虑 QTableView 是否阻碍了您而不是帮助您。内置的小部件非常棒,但我经常发现,当我需要在它们专门设计的领域之外冒险时,我最终会花更多的时间在它们周围工作而不是从中受益。我不知道你在做什么的正确解决方案,但如果是我,我会探索基于 QAbstractItemView 编写我自己的视图,然后为整个事情做我自己的自定义绘画。

这样做的缺点是QTableView为你提供了很多交互支持,所以如果交互对你有很大的好处,那你也得自己写。所以这是一个权衡。QTableView 的内置交互也有可能妨碍您尝试执行的操作。它可以去任何一种方式。


推荐阅读