如何禁用Qt中对 child 的setGraphicsEffect继承?

例如,假设我的项目具有以下层次结构:

c++ - 在Qt中禁用setGraphicsEffect继承-LMLPHP

当我将带有setGraphicsEffect的阴影应用于帧时,行编辑将继承该阴影效果,而我不希望那样。这就是我得到的:

c++ - 在Qt中禁用setGraphicsEffect继承-LMLPHP

如您所见,行编辑字母周围有一个阴影。任何想法如何解决这个问题?

还有一件事..在MainWindow上方的图像中明显可见有一些标志,例如Qt::FramelessWindowHint和Qt::WA_TranslucentBackground,因此该框架应该是“窗口”,并且当我调整MainWindow的大小时该框架会自动调整大小,这样我就可以不能改变那个层次。

根据Timusan的要求,这是阴影的代码:
Qt: shadow around window

要将其应用于框架:

CustomShadowEffect *shadow = new CustomShadowEffect();
shadow->setColor(c);
shadow->setDistance(scale);
shadow->setBlurRadius(blur_radius);
ui->frame->setGraphicsEffect(shadow);

更新
layout()->addWidget(ui->lineEdit);

最佳答案

QGraphicsItem::setGraphicsEffect的文档指出



因此,您期望的行为是正确的。

我的建议是通过调用QLineEdit或通过获取行编辑的默认文本效果来显式覆盖setGraphicsEffect(NULL)上的图形项,然后在框架上应用自定义效果后将其重新设置。我不确定行编辑是否具有默认效果,因此不确定是否可以使用NULL方法。

更新

如OP所述,通过使用null调用QGraphicsItem::setGraphicsEffect来覆盖现有效果的建议方法不起作用。因此,鉴于我看到另外两个可能性:

  • 不要将QLineEdit用作框架的子项(不确定这是否可行,您提到框架不能从窗口取消绑定(bind),但是与框架到行的编辑关系约束无关)。
  • 由于您已经使用CustomShadowEffect将图形效果进行了子类化,因此您可以调整draw()方法以忽略属于行编辑的QPainter的调用。您可以做的是保留效果中被忽略的QPaintDevice实例的列表-QWidget继承QPaintDevice,并且您可以通过QPainter::deviceQPaintDevice查询QPainter指针,因此您可以简单地将小部件添加到内部列表中,然后在draw方法中进行比较输入的QPaintDeviceQPainter变成被忽略的ojit_code。
  • 10-08 06:50