2016-11-27 1 views
1

"True Transparency" explanation (image, 76kb).Как сделать «True Transparent» окно для курсора, желательно на чистом QML? (Qt 5.7)

На этом изображении ApplicationWindow имеют прозрачно прозрачный слой. Но на самом деле курсор не идет в окно позади ApplicationWindow (в данном случае - QT Creator).

«Истинная прозрачность» достигается, если добавить (раскомментировать) флаг «Qt.WindowTransparentForInput», но кнопки больше недоступны (это очевидно, я знаю).

Я пробовал различные флаги с похожими значениями (из документации), но не нашел рабочей комбинации - курсор остается в состоянии «по умолчанию», когда он находится в границах окна (должен находиться в «тексте») state, потому что это текст ниже).

Неужели кто-то столкнулся с подобной проблемой, и вы нашли решение? Благодаря!

код с картинки и другие файлы проекта остались нетронутыми (Qt Quick Controls 2 Применение):

import QtQuick 2.7 
import QtQuick.Controls 1.5 

ApplicationWindow { 
    visible: true 
    width: 320 
    height: 240 
    x: 400 
    y: 210 
    color: "transparent" 
    flags: Qt.Widget | Qt.FramelessWindowHint //| Qt.WindowTransparentForInput 
    //| Qt.WA_TranslucentBackground //| Qt.WA_NoSystemBackground 
    //| Qt.WA_NoBackground //| Qt.WA_MouseNoMask 

    Button { 
     x: ApplicationWindow.width - width 
     text: "Right Top Window Corner" 
    } 
    Button { 
     y: ApplicationWindow.height - height 
     text: "Left Bottom Window Corner" 
    } 
} 
+0

Я думаю, вам нужно будет использовать API-интерфейсы операционной системы для достижения этого. – dtech

+0

Может быть, это можно сделать по-другому. Какую реальную цель вы хотите архивировать? – folibis

+0

Не уверен, что/как делать то, что вы хотите в 'qml', но в коде' C++ ', я думаю, [' QWidget :: setMask'] (http://doc.qt.io/qt-5/qwidget. html # setMask) может быть тем, что вы ищете. –

ответ

1

Одно из решений заключается в создании 3 окна, один для прозрачной области и по одному для каждой из кнопок.

import QtQuick 2.4 
import QtQuick.Controls 1.5 
import QtQuick.Window 2.0 

ApplicationWindow { 
    id: app 
    visible: true 
    width: 320 
    height: 240 
    x: 400 
    y: 210 
    color: "transparent" 
    flags: Qt.Widget | Qt.FramelessWindowHint | Qt.WindowTransparentForInput | Qt.WindowStaysOnTopHint 

    Window { 
     visible: true 
     flags: Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint 
     x: app.width - width 
     height: rightButton.implicitHeight 
     Button { 
      id: rightButton 
      text: "Right Top Window Corner" 
     } 
    } 
    Window { 
     visible: true 
     flags: Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint 
     y: app.height - height 
     height: leftButton.implicitHeight 
     Button { 
      id: leftButton 
      text: "Left Bottom Window Corner" 
     } 
    } 
} 
+0

Ваше решение работает, и толкнул меня вперед. Но создание разных окон, когда кнопок может быть много ... (запланированное динамическое создание элементов управления). Я подожду, и если нет лучшего варианта - я упомяну, что проблема решена. Большое спасибо! – C0oo1D

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