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

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

Вот пример программы на 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()

1 ответ

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

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

Вот код, который работает для меня; Я вижу окна других моих приложений внизу. Это C++. Я использую 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();
}
Другие вопросы по тегам