web-dev-qa-db-ja.com

Qtウィジェットのダークテーマですか?

バックグラウンド

PyQt5アプリケーションを構築していますが、暗いテーマを作りたいと思っています。以前は、Android開発で作業しましたが、アプリケーション全体に設定できる暗いテーマがありました

質問

Qtに組み込まれているダークテーマはありますか(アプリケーション内のすべてのウィジェットに適用され、クロスプラットフォームです)?

10
sunyata

いいえ、しかし、あなたは私のかなり包括的な stylesheets を使うことができます。これはほとんどのプラットフォームで見栄えがするはずです(KDEのBreezeテーマは、非常にエレガントな暗いテーマです)。これは優れた QDarkStylesheet から(ハード)分岐したもので、多くの分野でテーマの問題があると感じたため、自分のニーズに合わせて大幅に変更し、軽いテーマを追加しました。

簡単な使用

テーマのサンプルはこちらです。 PyQt5で使用するには、プロジェクトに次の行を追加するだけです:

import sys
from PyQt5.QtCore import QFile, QTextStream
from PyQt5.QtWidgets import QApplication
import breeze_resources

app = QApplication(sys.argv)
file = QFile(":/dark.qss")
file.open(QFile.ReadOnly | QFile.Text)
stream = QTextStream(file)
app.setStyleSheet(stream.readAll())

enter image description here

動的スタイルシートの切り替え

コメントへの応答として、ライトまたはダークスタイルシートを動的に使用するようにスタイルシートを調整する最も簡単な方法は、関数にラップすることです。次に、この関数をQtシグナルへのスロットとして使用できます(警告:私は主にC++を使用して開発しているため、シグナル/スロットメカニズムのコードに小さなエラーがある場合があります)。

def toggle_stylesheet(path):
    '''
    Toggle the stylesheet to use the desired path in the Qt resource
    system (prefixed by `:/`) or generically (a path to a file on
    system).

    :path:      A full path to a resource or file on system
    '''

    # get the QApplication instance,  or crash if not set
    app = QApplication.instance()
    if app is None:
        raise RuntimeError("No Qt Application found.")

    file = QFile(path)
    file.open(QFile.ReadOnly | QFile.Text)
    stream = QTextStream(file)
    app.setStyleSheet(stream.readAll())

シグナル/スロットメカニズムでこの関数を使用できる汎用アプリケーションロジックを追加できます(必要に応じて、便利なラッパーとしてラムダを使用して、スタイルシートトグルへのパスを提供します)。

# add logic for setting up application
app = QApplication(sys.argv)
# more logic for creating top-level widgets, application logic ...

parent = ...
light_btn = QPushButton("Toggle light.", parent)
light_btn.clicked.connect(lambda: toggle_stylesheet(":/light.qss"))

dark_btn = QPushButton("Toggle dark.", parent)
dark_btn.clicked.connect(lambda: toggle_stylesheet(":/dark.qss"))

# add to the layout, do other stuff
# ...

# end the Qt application
sys.exit(app.exec_())

これにより、ユーザーはPyQt5(またはC++、Qt5の類似ロジックを使用)で開発されたアプリケーションのテーマを明るいテーマまたは暗いテーマに動的に変更できます。

免責事項:明らかに私はメンテナーです。

17

Qtにはダークテーマは組み込まれていません。ただし、次のコードを使用すると、自分で簡単に作成できます。

from PyQt5.QtWidgets import QApplication
from PyQt5.QtGui import QPalette

app = QApplication([])
# Force the style to be the same on all OSs:
app.setStyle("Fusion")

# Now use a palette to switch to dark colors:
palette = QPalette()
palette.setColor(QPalette.Window, QColor(53, 53, 53))
palette.setColor(QPalette.WindowText, Qt.white)
palette.setColor(QPalette.Base, QColor(25, 25, 25))
palette.setColor(QPalette.AlternateBase, QColor(53, 53, 53))
palette.setColor(QPalette.ToolTipBase, Qt.white)
palette.setColor(QPalette.ToolTipText, Qt.white)
palette.setColor(QPalette.Text, Qt.white)
palette.setColor(QPalette.Button, QColor(53, 53, 53))
palette.setColor(QPalette.ButtonText, Qt.white)
palette.setColor(QPalette.BrightText, Qt.red)
palette.setColor(QPalette.Link, QColor(42, 130, 218))
palette.setColor(QPalette.Highlight, QColor(42, 130, 218))
palette.setColor(QPalette.HighlightedText, Qt.black)
app.setPalette(palette)

これの良いところは、外部の依存関係を導入しないことです。上記の変更がどのように見えるかに興味がある場合、サンプルを作成しました ダークテーマのPyQt5アプリ 。これがスクリーンショットです:

Qt dark theme

4

私のブックマークに設立されました。元のソースを覚えていません。

QApplication::setStyle(QStyleFactory::create("Fusion"));
QPalette p;
p = qApp->palette();
p.setColor(QPalette::Window, QColor(53,53,53));
p.setColor(QPalette::Button, QColor(53,53,53));
p.setColor(QPalette::Highlight, QColor(142,45,197));
p.setColor(QPalette::ButtonText, QColor(255,255,255));
qApp->setPalette(p);

追伸必要に応じて、QSSで調整できます。

0
Dmitry Sazonov