Использование Qt для создания эффекта прозрачности OS X Yosemite

Мы пытаемся создать QMainWindow с эффектом прозрачности Mac OSX Yosemite. Мы используем PyQt, но проблема в Qt. С тем, что мы пробовали до сих пор, оно всегда либо полностью прозрачно, либо полностью непрозрачно (как обычное окно). Если мы включим Qt.WA_TranslucentBackground, фон окна станет полностью прозрачным на 100%.
Кроме того, QGraphicsView, который мы отображаем на нем, оставляет следы при прокрутке. Ввод мыши также «проходит через» прозрачные части — щелчок по прозрачной части графического представления будет регистрироваться как щелчок по окну за ним. Установка таблицы стилей с любым пользовательским цветом фона не имеет никакого эффекта. Если мы отключим его, окно останется непрозрачным. Затем мы можем изменить цвет фона с помощью таблицы стилей, но он по-прежнему будет непрозрачным.
Включение и выключение Turing WA_FramelessWindowHint, похоже, тоже ничего не исправляет. Не работает и setAutoFillBackground(). Вы знаете, как сделать окно с эффектом прозрачности Yosemite?

Вот пример программы Python для проверки:

# Attempt at Mac OSX Translucency (example code)

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
Qt = QtCore.Qt

class ExampleMainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.testWidget = QtWidgets.QLabel('Test label, which should be transparent')

        # Make sure the testWidget is transparent
        self.testWidget.setStyleSheet('background: transparent')
        self.testWidget.setAttribute(Qt.WA_TranslucentBackground, True)
        self.testWidget.setAutoFillBackground(True)

        self.setStyleSheet('background: rgba(255, 255, 255, 0.8)')
        self.setAttribute(Qt.WA_TranslucentBackground, True)
        self.setAutoFillBackground(True)
        #self.setWindowFlags(Qt.FramelessWindowHint) # Doesn't seem to help

        self.setCentralWidget(self.testWidget)

def main():
    global app, exWindow
    app = QtWidgets.QApplication(sys.argv)

    exWindow = ExampleMainWindow()
    exWindow.show()
    exitcodesys = app.exec_()
    app.deleteLater()
    sys.exit(exitcodesys)

if __name__ == '__main__': main()

person Meorge    schedule 07.12.2014    source источник
comment
Код иногда стоит тысячи слов.   -  person lpapp    schedule 07.12.2014
comment
Я не понимаю, как вставлять код в пост, поэтому вот он в пасти: bpaste.net/ показать/b0fbe94e90ce   -  person Meorge    schedule 07.12.2014
comment
Несколько советов по форматированию кода: stackoverflow.com/help/formatting.   -  person Michał Ciuba    schedule 07.12.2014
comment
Итак, человек, помогавший мне с этим проектом, сделал пример программы Python, чтобы проверить это. Вот код: bpaste.net/show/8c1abf7c0dfc Вывод: dropbox.com/s/ger3m15humuyymx/ Это пример типа кода, с которым мы пытаемся работать — только мы хотим, чтобы он выглядел как «матовое стекло» из Yosemite.   -  person Meorge    schedule 07.12.2014


Ответы (1)


Ваша таблица стилей недействительна. Qt rgba ожидает целое число в диапазоне 0-255 или процент только для значений. Поэтому используйте 80% вместо 0,8. Наряду с WA_TranslucentBackground это должно помочь вам.

И, пожалуйста, разместите свой код в вопросе, так как срок действия ваших паст истекает через несколько дней, и этот вопрос будет непригоден для использования.

Вот код, который у меня работает; Я вижу окна других приложений внизу. Это С++. Я использую Qt4, а не 5; возможно, это имеет значение.

#include <QMainWindow>
#include <QApplication>
#include <QLabel>

class MyMain : public QMainWindow
{
    Q_OBJECT

public:
    MyMain(QWidget* parent = 0);

};

MyMain::MyMain(QWidget* parent)
    : QMainWindow(parent)
{
    setAttribute(Qt::WA_TranslucentBackground, true);
    setStyleSheet("background: rgba(0,0,0,80%);");

    QLabel* foo = new QLabel();
    foo->setText("hello");
    foo->setStyleSheet("color: white;");
    setCentralWidget(foo);
}

#include "main.moc"

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    MyMain m;
    m.show();
    return app.exec();
}
person Hamish Moffatt    schedule 08.12.2014
comment
Если я установлю его в процентах (скажем, «80%»), не устанавливая WA_TranslucentBackground в значение True, он будет иметь только оттенки серого (не видно окон под ним), но если я установлю WA_TranslucentBackground в значение True, он полностью прозрачен, и я могу даже щелкайте по окнам под ним: ">dropbox.com/s/yfbj5cabzl0gwb7/› Существует ли известный способ придать ему вид "матового стекла" вместо простой полупрозрачности? - person Meorge; 08.12.2014
comment
Я попытался запустить это сегодня, и это дало ошибку, что QMainWindow не может быть найден. Не могли бы вы помочь мне с этим? Кроме того, не могли бы вы сделать скриншот вашего вывода, чтобы я мог видеть, как он выглядит? - person Meorge; 10.12.2014
comment
Если вы используете Qt5, вам понадобится QT += QtWidgets в файле проекта. Вот мой скриншот: i57.tinypic.com/2rystjk.png - person Hamish Moffatt; 11.12.2014
comment
Присланный вами SS выглядит хорошо, однако он не выглядит как матовое стекло (хотя не похоже, что вы используете Yosemite). Знаете ли вы, что этот код придаст Йосемити вид матового стекла? - person Meorge; 11.12.2014
comment
Вот скриншот из Йосемити — i58.tinypic.com/2lvk3vd.jpg. Нет, он не выглядит так, как вы хотите; Я ожидаю, что вам нужно будет поместить текстурированный фон в свое собственное приложение, а не простой rgba (0,0,0,80%). - person Hamish Moffatt; 11.12.2014