superposición superposicion samsung prime pantalla desactivar como qt qwidget

qt - superposicion - Dibuje una superposición rectangular en QWidget al hacer clic



superposición de pantalla samsung j7 (2)

en mi proyecto utilizo un EventFilter para widgets, que están en un QHBoxLayout .

Si hago clic en un widget, quiero dibujar una superposición transparente con color azul sobre el widget cliqueado. ¿Hay alguna manera de implementar esto?

saludos


En el constructor del widget de superposición:

setWindowFlags(Qt::Widget | Qt::FramelessWindowHint | Qt::ToolTip | Qt::WindowStaysOnTopHint); setAttribute(Qt::WA_NoSystemBackground, true); setAttribute(Qt::WA_TranslucentBackground, true);

En la ventana que posee ese widget:

overlay_ = new RtspOverlay(this); overlay_->show();


Esta respuesta está en una serie de mis respuestas relacionadas con la superposición: primero , segundo , tercero .

Una forma de hacerlo es:

  1. Tenga un widget de superposición semitransparente que también sea transparente para los eventos del mouse.

  2. En el filtro de eventos, realice un seguimiento de los clics y el cambio de tamaño de los objetos ajustando la geometría de la superposición para que coincida con la del widget de destino.

El siguiente ejemplo autónomo funciona tanto con Qt 4 como con Qt 5 y hace lo que desea.

// https://github.com/KubaO/n/tree/master/questions/overlay-19199863.pro #include <QtGui> #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) #include <QtWidgets> #endif class Overlay : public QWidget { public: Overlay(QWidget * parent = nullptr) : QWidget{parent} { setAttribute(Qt::WA_NoSystemBackground); setAttribute(Qt::WA_TransparentForMouseEvents); } protected: void paintEvent(QPaintEvent *) override { QPainter{this}.fillRect(rect(), {80, 80, 255, 128}); } }; class Filter : public QObject { QPointer<Overlay> m_overlay; QPointer<QWidget> m_overlayOn; public: Filter(QObject * parent = nullptr) : QObject{parent} {} protected: bool eventFilter(QObject * obj, QEvent * ev) override { if (!obj->isWidgetType()) return false; auto w = static_cast<QWidget*>(obj); if (ev->type() == QEvent::MouseButtonPress) { if (!m_overlay) m_overlay = new Overlay(w->parentWidget()); m_overlay->setGeometry(w->geometry()); m_overlayOn = w; m_overlay->show(); } else if (ev->type() == QEvent::Resize) { if (m_overlay && m_overlayOn == w) m_overlay->setGeometry(w->geometry()); } return false; } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); Filter filter; QWidget window; QHBoxLayout layout(&window); for (auto text : { "Foo", "Bar", "Baz "}) { auto label = new QLabel{text}; layout.addWidget(label); label->installEventFilter(&filter); } window.setMinimumSize(300, 250); window.show(); return a.exec(); }