QCheckBox function connecting
у меня возникла проблема из-за не совершенного знания библеотеки pyqt: Я хочу менять тему всех виджетов в приложении по нажатию на QCheckbox. У меня есть файл theme.py c кодом:
from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *
class themes():
def light_theme(self):
if self.btn_bw.isChecked() == True:
global clr_btn_text, clr_btn_bg, clr_btn_hover, clr_btn_prsd, clr_icon, \
clr_toggle, clr_page_bg, clr_widgets_bg, clr_widgets_border, clr_page_text
#LEFT MENU BUTTONS
clr_btn_text = '#2b2b2b'
clr_btn_bg = '#c3c3c3'
clr_btn_hover = '#ececec'
clr_btn_prsd = '#cccccc'
#ICON
clr_icon = '#3e3e3e'
#TOGGLE
clr_toggle = '#b4b4b4'
#PAGES
clr_page_bg = '#9c9c9c'
clr_widgets_bg = '#d8d8d8'
clr_widgets_border = '#4c4c4c'
clr_page_text = '#090909'
else:
clr_btn_text = '#c3ccdf'
clr_btn_bg = '#44475a'
clr_btn_hover = '#272832'
clr_btn_prsd = '#2c313a'
# ICON
clr_icon = '#c3ccdf'
# TOGGLE
clr_toggle = '#323844'
# PAGES
clr_page_bg = '#22252c'
clr_widgets_bg = '#282c34'
clr_widgets_border = '#c3ccdf'
clr_page_text = '#ffffff'
В другом файле у меня код со всем виджетами, в него я импортирую класс themes.
Я хочу к примеру по нажатию на Checkboxself.btn_bw = QCheckBox(self.frame)
изменить цвет frame
self.frame_basic = QFrame(self.page_3)
self.frame_basic.setObjectName(u"frame_basic")
self.frame_basic.setMinimumSize(QSize(450, 330))
self.frame_basic.setMaximumSize(QSize(450, 330))
self.frame_basic.setStyleSheet(u"QFrame {\n"
" background-color: clr_widgets_bg;\n"
" color: rgb(255, 255, 255);\n"
" border-radius: 10px;\n"
"}")
через self.btn_bw.connect(themes.light_theme(self)) с clr_widgets_bg = '#282c34' на clr_widgets_bg = '#d8d8d8' но мне выдаёт ошибку
self.btn_bw.connect(themes.light_theme(self))
TypeError: PySide6.QtCore.QObject.connect(): not enough arguments
скорее всего я всё слишком усложняю и осуществить мою задачу можно намного проще, поэтому прошу помочь с решением проблемы
Ответы (2 шт):
Автор решения: Александр
→ Ссылка
import sys
from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout
from PySide6.QtWidgets import QCheckBox
from PySide6.QtCore import QSize, SIGNAL, QObject
dark_theme = """
QWidget#MainWindow {
background-color: #333333;
}
QPushButton#ButtonPrintMessage{
background-color: #555555;
color: #aaaaaa
}
"""
default_theme = """
QWidget#MainWindow {
background-color: #ffffff;
}
"""
class Theme(QObject):
def __init__(self, parent=None):
super().__init__()
self.parent = parent
def dark(self, value):
if value == 2:
self.parent.setStyleSheet(dark_theme)
def default(self, value):
if value == 0:
self.parent.setStyleSheet(default_theme)
class Example(QWidget):
def __init__(self):
super().__init__()
self.resize(QSize(180, 120))
self.setObjectName("MainWindow")
box = QHBoxLayout()
self.setLayout(box)
self.theme = Theme(self)
self.theme_check = QCheckBox('Тёмная тема', self)
#QObject.connect(self.theme_check, SIGNAL('clicked()'), self.theme.dark)
#self.theme_check.connect(self.theme_check, SIGNAL('clicked()'), self.theme.dark)
self.theme_check.connect(self.theme_check, SIGNAL("stateChanged(int)"), self.theme.dark)
self.theme_check.connect(self.theme_check, SIGNAL('stateChanged(int)'), self.theme.default)
#self.theme_check.connect(theme, SIGNAL ('checked()'), theme.dark)
self.button_print_message = QPushButton("Напечатать сообщение", objectName="ButtonPrintMessage")
#self.theme_check.stateChanged.connect(self.state_changed)
self.button_print_message.clicked.connect(self.button_print_message_click_handler)
box.addWidget(self.button_print_message)
#self.button_print_message.connect(QPushButton)
#button = QPushButton(self, text="Call func")
#QObject.connect(button, SIGNAL ('clicked()'), self.foo)
#button.connect()
def button_print_message_click_handler(self):
print('Hello, World!')
def state_changed(self):
if self.theme_check.isChecked():
self.setStyleSheet(dark_theme)
else:
self.setStyleSheet(default_theme)
def foo(self):
print("foo")
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
Автор решения: Александр
→ Ссылка
Можно так
import sys
from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout
from PySide6.QtWidgets import QCheckBox
from PySide6.QtCore import QSize, SIGNAL, QObject
dark_theme = """
QWidget#MainWindow {
background-color: #333333;
}
QPushButton#ButtonPrintMessage{
background-color: #555555;
color: #aaaaaa
}
"""
default_theme = """
QWidget#MainWindow {
background-color: #ffffff;
}
"""
class Theme(QObject):
def __init__(self, parent=None):
super().__init__()
self.parent = parent
def dark(self):
if self.parent.theme_check.isChecked():
self.parent.setStyleSheet(dark_theme)
def default(self):
if not self.parent.theme_check.isChecked():
self.parent.setStyleSheet(default_theme)
class Example(QWidget):
def __init__(self):
super().__init__()
self.resize(QSize(180, 120))
self.setObjectName("MainWindow")
box = QHBoxLayout()
self.setLayout(box)
self.theme = Theme(self)
self.theme_check = QCheckBox('Тёмная тема', self)
self.button_print_message = QPushButton("Напечатать сообщение", objectName="ButtonPrintMessage")
self.theme_check.stateChanged.connect(self.state_changed)
self.button_print_message.clicked.connect(self.button_print_message_click_handler)
box.addWidget(self.button_print_message)
def button_print_message_click_handler(self):
print('Hello, World!')
def state_changed(self):
if self.theme_check.isChecked():
self.setStyleSheet(dark_theme)
else:
self.setStyleSheet(default_theme)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())