2013-08-30 20 views
6

im przy użyciu QQmlApplicationEngine z QQuickWindow dla aplikacji i nie mogę przezroczyste okno główne. Chcę ustawić splash przed aplikacją wyskakuje i używać elementu okiennego dla niego i powinno być przejrzyste, ale to nie jest mój main.cpp jestQQuickWindow przezroczysty

int main(int argc, char *argv[]) 
{ 
Application app(argc, argv); 

QShookaClient shooka_client; 
QQmlApplicationEngine engine; 
engine.rootContext()->setContextProperty("shooka", &shooka_client); 
engine.load(QUrl("qrc:///shooka/shooka.qml")); 

QObject *topLevel = engine.rootObjects().value(0); 
QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel); 

window->show(); 
window->setFlags(Qt::FramelessWindowHint); 
window->setColor(Qt::transparent); 

return app.exec(); 
} 

ale setColor nie działa w Win7. Wiem, że istnieje sposób dla QDeclarativeView lub nawet znalazłem rozwiązanie dla QQuickview i to powinno działać dla QQuickWindow, ale nie, czy ktoś może mi pomóc proszę ..

+0

QWindow to nie to samo co QWidget. ... Zobacz wszystkie klasy pochodzą z QWidget. –

Odpowiedz

0

Możesz rozważyć użycie poniższego kodu do uzyskania przezroczystego efektu okna bezramkowego:

setWindowFlags(
     #ifdef Q_OS_MAC 
      Qt::SubWindow | 
     #else 
      Qt::Tool | 
     #endif 
      Qt::FramelessWindowHint | 
      Qt::WindowSystemMenuHint | 
      Qt::WindowStaysOnTopHint 
     ); 

setAttribute(Qt::WA_NoSystemBackground, true); 
// set the parent widget's background to translucent 
setAttribute(Qt::WA_TranslucentBackground, true); 

setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); 
// create a display widget for displaying child widgets 
QWidget* displayWidget = new QWidget; 
displayWidget->setStyleSheet(".QWidget { background-color: rgba(0, 0, 0, 75%); border-width: 1px; border-style: solid; border-radius: 10px; border-color: #555555; } .QWidget:hover { background-color: rgba(68, 68, 68, 75%); border-width: 2px; border-style: solid; border-radius: 10px; border-color: #ffffff; }"); 

Pomysł polega na tym, że okno nadrzędne lub zawierające okno nie ma ramki i ma półprzezroczyste tło. Następnie zagnieżdżamy QWidget podrzędny wewnątrz rodzica QWidget i stosujemy style, używając QSS do przezroczystości.

+2

tanx Cameron, ale problemem jest to, że QWindow nie jest taki sam jak QWidget. Nie jestem ekspertem od qt i wiem, że muszą się z tym jakoś powiązać ... ale tak naprawdę ??? a QQuickWindow nie ma nawet ustawienia Atrybutu jak QWidget lub cokolwiek innego z QQuickView ... – ali

4

Należy zdać sobie sprawę, że typ QtQuick typu Window jest mapowany na klasę C++ na QQuickWindow i pochodzi z QWindow. Flagi okien, na odpowiedź Camerona, można ustawić. Ale musisz również ustawić wartość opacity na, powiedzmy, 0,75, aby była półprzezroczysta. Wszystko to można zrobić w QML, nie trzeba ustawiać flag z C++.

screenshot

import QtQuick 2.1 
import QtQuick.Controls 1.0 
import QtQuick.Window 2.0 

ApplicationWindow { 
    title: qsTr("Hello World") 
    width: 640 
    height: 480 
    flags: Qt.SubWindow | Qt.Tool | Qt.FramelessWindowHint | Qt.WindowSystemMenuHint | Qt.WindowStaysOnTopHint 
    opacity: 0.75 
    visible: true 
    menuBar: MenuBar { 
     Menu { 
      title: qsTr("File") 
      MenuItem { 
       text: qsTr("Exit") 
       onTriggered: Qt.quit(); 
      } 
     } 
    } 
    Button { 
     text: "Hello World" 
     anchors.centerIn: parent 
    } 
} 
+0

. Zrobiłem to, co mi powiedziałeś, ale to zadziałało: D nie wiem co jest nie tak z Win7 lub po prostu zrobiłem źle. ale ja również po prostu skopiuj i wklej swój kod do kopalni, a program był uruchomiony, a zadanie było w menedżerze zadań, ale nic na moim ekranie ... nie masz pojęcia? – ali

+0

Nie testowałem tego pod Windows 7. Czy używasz funkcji Qt pod kątem pod kątem lub opengl pod Win7? –

4

wiem, że to jest stare pytanie, ale ponieważ nie jest oznaczony jako rozwiązany, tutaj jest moje podejście:

import QtQuick 2.4 
import QtQuick.Controls 1.3 

ApplicationWindow { 
    title: qsTr("Hello World") 
    width: 640 
    height: 480 
    flags: Qt.FramelessWindowHint 
    color: "transparent" 
    visible: true 
    Rectangle 
    { 
     color:"red" 
     width: parent.width/2 
     height: parent.height/2;anchors.centerIn: parent 
    } 
} 

W rezultacie otrzymasz przezroczyste tło z czerwonym prostokątem pośrodku. Możesz łatwo zmienić ten prostokąt dla obrazu.

Hope pomógł komuś.

Powiązane problemy