如何禁用Qt中对 child 的setGraphicsEffect继承?
例如,假设我的项目具有以下层次结构:
当我将带有setGraphicsEffect的阴影应用于帧时,行编辑将继承该阴影效果,而我不希望那样。这就是我得到的:
如您所见,行编辑字母周围有一个阴影。任何想法如何解决这个问题?
还有一件事..在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::device从QPaintDevice
查询QPainter
指针,因此您可以简单地将小部件添加到内部列表中,然后在draw
方法中进行比较输入的QPaintDevice
的QPainter
变成被忽略的ojit_code。