2013-08-30 3 views
6

im using QQmlApplicationEngine с QQuickWindow для приложения, и я не могу прозрачное главное окно. я хочу установить всплеск, прежде чем приложение выскакивает и я использую компонент Window для него, и он должен быть прозрачным, но это не моя main.cpp являетсяQQuickWindow transparent

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(); 
} 

но SetColor не работает в win7. Я знаю, что есть способ для QDeclarativeView или даже я нашел решение для QQuickview, и это должно работать для QQuickWindow, но нет, может кто-нибудь мне помочь.

+0

QWindow - это не то же самое, что QWidget. ... Просмотреть классы, полученные из QWidget. –

ответ

0

Возможно, вы можете использовать следующий код для достижения бескаркасного прозрачного эффекта окна:

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; }"); 

Идея заключается в том, что у вашего родительского окна или с окном нет рамки и есть полупрозрачный фон. Затем вы вставляете дочерний QWidget внутри родительского QWidget и применяете стили, используя QSS для прозрачности.

+2

tanx Cameron, но проблема QWindow - это не то же самое, что QWidget. Я не специалист в qt, и я знаю, что они должны так или иначе связать ... но реально как ??? и QQuickWindow даже не имеет атрибута, который должен быть установлен как QWidget или что-нибудь диск из QQuickView ... – ali

4

Нужно понимать, что тип QtQuick Window сопоставляется с классом C++ QQuickWindow и происходит от QWindow. Могут быть установлены флаги окон, на каждый ответ Камерона. Но вам также нужно установить opacity, скажем, 0,75, чтобы сделать его полупрозрачным. Все это можно сделать в QML, не нужно устанавливать флаги из 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

вы знаете. я сделал то, что сказал мне, но это не сработало: D я не знаю, что случилось с win7, или я просто ошибся. но я также просто копирую и вставляю свой код в шахту, и программа запускалась, и задача была в taskmanager, но ничего на моем экране ... у вас есть идея? – ali

+0

Я не тестировал его под Windows 7. Используете ли вы угловую или opengl-сборку Qt под Win7? –

4

Я знаю, что это старый вопрос, но так как он не отмечен как решен, вот мой подход:

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 
    } 
} 

В результате вы получите прозрачный фон с красным прямоугольником посередине. Вы можете легко изменить этот прямоугольник для изображения.

Надежда помогла кому-то.