2015-06-24 6 views
0

Как отключить наследование setGraphicsEffect для детей в Qt?Отключить наследование setGraphicsEffect в Qt

Например, представьте мой проект имеет эту иерархию: http://i.imgur.com/B1PbGPR.png

Когда я применяю тень с setGraphicsEffect к раме линии редактирования унаследует что эффект тени, и я не хочу этого. Это то, что я получаю: http://i.imgur.com/Qo1aVSK.png

Как вы можете видеть, вокруг букв строки редактируется тень. Любая идея, как это исправить?

Еще одна вещь, видимая на изображении над MainWindow, имеет такие флаги, как Qt :: FramelessWindowHint и Qt :: WA_TranslucentBackground, поэтому кадр должен быть «окном», и кадр автоматически изменяется при изменении размера MainWindow, поэтому я не могу изменить эту иерархию.

В соответствии с просьбой Timusan здесь код тени: Qt: shadow around window

Чтобы применить его к раме:
CustomShadowEffect * тень = новый CustomShadowEffect();
shadow-> setColor (c);
тень-> комплектDistance (масштаб);
тень-> комплектBlurRadius (blur_radius);
ui-> рама-> комплектGraphicsEffect (тень);

ОБНОВЛЕНИЕ
макета() -> addWidget (ui-> lineEdit);

+0

Привет и добро пожаловать в SO! Хорошо сформированный вопрос, но можете ли вы также опубликовать образец кода того, как вы применили тень? Когда люди видят код, они могут получить лучшее представление о том, что вам может не хватать. – Timusan

+0

Код тени (первый ответ): http://stackoverflow.com/questions/23718827/qt-shadow-around-window Как я применил тень: shadow-> setColor (c); тень-> комплектDistance (масштаб); тень-> комплектBlurRadius (blur_radius); ui-> рама-> комплектGraphicsEffect (тень); @Timusan –

ответ

1

Документация QGraphicsItem::setGraphicsEffect утверждает, что

Примечание: Эта функция будет применяться эффект на себя и всех своих детей.

Таким образом, поведение, которого вы ожидаете, является правильным.

То, что я хотел бы предложить это переопределение графического элемента на QLineEdit явно путем вызова setGraphicsEffect(NULL) или получать эффект текста по умолчанию строки редактирования, а затем установить его обратно после пользовательского эффекта на раме была применено. Я не уверен, что редактирование линии имеет эффект по умолчанию или нет, поэтому не уверен, будет ли применяться NULL-подход.

UPDATE

Как заявил О.П. предлагаемый способ отменяя существующий эффект, вызвав QGraphicsItem::setGraphicsEffect с нулем не работает. Поэтому, учитывая, что я вижу еще 2 possibilies:

  • Не делайте QLineEdit ребенок рамы (не уверен, если это возможно, вы упомянули, что кадр не может быть несвязанным из окна, но ничего о кадре на линию изменить ограничения отношений).
  • Поскольку вы уже подклассифицировали графический эффект с помощью своего CustomShadowEffect, вы можете настроить метод draw(), чтобы игнорировать вызовы с QPainter, которые принадлежат к редактированию строки.Что вы можете сделать, это сохранить список игнорируемых QPaintDevice случаев в эффекте - QWidget наследует QPaintDevice и вы можете запросить QPaintDevice указатель из QPainter через QPainter::device, так что вы можете просто добавить виджеты на свой внутренний список, а затем в методе draw сравнить QPaintDevice входящих QPainter на игнорируемые.
+1

Настройка setGraphicsEffect (NULL) для редактирования строки не работает. Также получение текстового эффекта бесполезно, потому что его нет. Способ наследования здесь отличается. Он не устанавливает тот же эффект для детей, вместо этого Qt-бэкенд обнаружит, что в кадре есть дети и будет оказывать им тот же эффект. –

+0

@RicardoGomes спасибо за отзыв :) Я попытался дать дополнительные идеи, если они любой помощи. –

+0

Спасибо @ RudolfsBundulis за идеи. Как я уже говорил, первая идея невозможна. Это то, что происходит, когда я это делаю: http://i.imgur.com/ATv8iti.png Мне нужно, чтобы QLineEdit над фреймом. Вторая идея могла бы сделать трюк, но я не знаю, как это сделать, и художник -> device() всегда возвращает тот же указатель. –

Смежные вопросы