Изменение заднего фона открывающегося меню qcombobox, drop-arrow и scrollbar
Есть код, в котором есть qcombobox. Мне нужно добавить туда стрелочку и когда comobox закрыт - она должна смотреть направо, а когда combobx открывается то она должна поворачиваться на 90 градусов вниз.
Так же есть проблема с выпадающим меню. Задний фон должен быть белым, но он градиентный.
Так-же можно ли изменить скроллбар, например цвет оранжевый и закруглёные углы.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(472, 426)
MainWindow.setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.011, y1:1, x2:1, y2:0, stop:0 rgba(182, 29, 212, 255), stop:1 rgba(48, 7, 182, 255));\n"
"")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.comboBox_2 = QtWidgets.QComboBox(self.centralwidget)
self.comboBox_2.setGeometry(QtCore.QRect(90, 80, 271, 41))
palette = QtGui.QPalette()
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(183, 178, 188))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Highlight, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(183, 178, 188))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Highlight, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(183, 178, 188))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Highlight, brush)
self.comboBox_2.setPalette(palette)
font = QtGui.QFont()
font.setFamily("Arial")
font.setPointSize(13)
font.setBold(True)
font.setWeight(75)
self.comboBox_2.setFont(font)
self.comboBox_2.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.comboBox_2.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.comboBox_2.setAutoFillBackground(False)
self.comboBox_2.setStyleSheet("border-top-left-radius: 7;\n"
"border-top-right-radius: 7;\n"
"background-color: rgb(255, 255, 255);\n"
"\n"
"\n"
"\n"
"}\n"
"\n"
"QComboBox::drop-down {\n"
" background-color: transparent;\n"
"\n"
"}\n"
"\n"
"QComboBox:hover {\n"
" background-color: rgba(188, 188, 188, 240);\n"
"\n"
" \n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"")
self.comboBox_2.setEditable(False)
self.comboBox_2.setMaxVisibleItems(11)
self.comboBox_2.setIconSize(QtCore.QSize(45, 45))
self.comboBox_2.setFrame(False)
self.comboBox_2.setObjectName("comboBox_2")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.comboBox_2.addItem("")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(0, 30, 471, 41))
font = QtGui.QFont()
font.setFamily("Arial")
font.setPointSize(20)
font.setStyleStrategy(QtGui.QFont.PreferAntialias)
self.label.setFont(font)
self.label.setStyleSheet("color: rgb(255, 255, 255);\n"
"background-color: transparent;")
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
self.comboBox_2.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.comboBox_2.setCurrentText(_translate("MainWindow", "1"))
self.comboBox_2.setItemText(0, _translate("MainWindow", "1"))
self.comboBox_2.setItemText(1, _translate("MainWindow", "2"))
self.comboBox_2.setItemText(2, _translate("MainWindow", "3"))
self.comboBox_2.setItemText(3, _translate("MainWindow", "4"))
self.comboBox_2.setItemText(4, _translate("MainWindow", "5"))
self.comboBox_2.setItemText(5, _translate("MainWindow", "6"))
self.comboBox_2.setItemText(6, _translate("MainWindow", "7"))
self.comboBox_2.setItemText(7, _translate("MainWindow", "8"))
self.comboBox_2.setItemText(8, _translate("MainWindow", "9"))
self.comboBox_2.setItemText(9, _translate("MainWindow", "10"))
self.comboBox_2.setItemText(10, _translate("MainWindow", "11"))
self.comboBox_2.setItemText(11, _translate("MainWindow", "12"))
self.comboBox_2.setItemText(12, _translate("MainWindow", "13"))
self.comboBox_2.setItemText(13, _translate("MainWindow", "14"))
self.comboBox_2.setItemText(14, _translate("MainWindow", "15"))
self.comboBox_2.setItemText(15, _translate("MainWindow", "16"))
self.comboBox_2.setItemText(16, _translate("MainWindow", "17"))
self.comboBox_2.setItemText(17, _translate("MainWindow", "18"))
self.comboBox_2.setItemText(18, _translate("MainWindow", "19"))
self.comboBox_2.setItemText(19, _translate("MainWindow", "20"))
self.label.setText(_translate("MainWindow", "Самый обычный Combo Box"))
class ExampleApp(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
if __name__=="__main__":
app = QtWidgets.QApplication(sys.argv)
window = ExampleApp()
window.show()
sys.exit(app.exec_())
Ответы (1 шт):
Мне почему-то кажется, что то, что вы хотите, лучше делать не в Qt Designere.
Вот вам Примеры таблиц стилей Qt https://doc.qt.io/archives/qt-4.8/stylesheet-examples.html
и пример, на котором вы можете потренироваться.
from PyQt5 import QtCore, QtWidgets
class Widget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
combo = QtWidgets.QComboBox()
self.list = QtWidgets.QListView(combo)
combo.addItems(["item1", "item2", "item3", "item4", "item5", "item6",
"item7", "item8", "item9", "item10", "item11", "item12",])
combo.setView(self.list)
combo.activated[str].connect(self.onActivatedText)
combo.setMinimumWidth(200)
label = QtWidgets.QLabel("Самый обычный Combo Box")
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(label)
layout.addWidget(combo)
@QtCore.pyqtSlot(str)
def onActivatedText(self, text):
print(text)
CSS = '''
QWidget {
background-color: #18465d;
}
QComboBox {
font: 12pt Fira Sans Condensed;
background-color: #2e2e2e;
border-top: 0px solid #3e3e3e;
border-left: 0px solid #3e3e3e;
border-right: 0px solid #3e3e3e;
border-bottom: 2px solid #3e3e3e;
padding: 5%;
max-height: 30px;
min-width: 140px;
color: white;
selection-background-color: #5e5e5e;
border-radius: 7px; /* закруглёные углы */
}
QComboBox::hover {
background-color: #5e5e5e;
}
QComboBox::drop-down {
border: none;
}
QComboBox::down-arrow {
/* поставьте свои картинки */
image: url(D:/_Qt/img/stylesheet-branch-closed.png);
width: 25px;
height: 25px;
border-width: 0px;
padding-right: 10px;
}
QComboBox::down-arrow:pressed {
/* поставьте свои картинки */
image: url(D:/_Qt/img/stylesheet-branch-open.png);
background-color: #fff;
}
QListView {
font: 12pt Fira Sans Condensed;
background-color: #2e2e2e;
outline: 0;
color: white;
selection-background-color: #5e5e5e;
}
QListView::item {
min-height: 20px;
padding: 5%;
}
QLabel {
color: rgb(255, 255, 255);
font: 15pt Fira Sans Condensed;
}
'''
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
app.setStyleSheet(CSS)
w = Widget()
w.show()
sys.exit(app.exec_())
А как сделать так чтоб при нажатии на сам combobox менялясь стрелка, а не при нажатии на саму стрелку?
Обратите внимания на новую строку в app.setStyleSheet(StyleSheet)
from PyQt5 import QtCore, QtWidgets
class Widget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
combo = QtWidgets.QComboBox()
self.list = QtWidgets.QListView(combo)
combo.addItems(["item1", "item2", "item3", "item4", "item5", "item6",
"item7", "item8", "item9", "item10", "item11", "item12",])
combo.setView(self.list)
combo.activated[str].connect(self.onActivatedText)
combo.setMinimumWidth(200)
label = QtWidgets.QLabel("Самый обычный Combo Box")
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(label)
layout.addWidget(combo)
@QtCore.pyqtSlot(str)
def onActivatedText(self, text):
print(text)
CSS = '''
QWidget {
background-color: #18465d;
}
QComboBox {
font: 12pt Fira Sans Condensed;
background-color: #2e2e2e;
border-top: 0px solid #3e3e3e;
border-left: 0px solid #3e3e3e;
border-right: 0px solid #3e3e3e;
border-bottom: 2px solid #3e3e3e;
padding: 5%;
max-height: 30px;
min-width: 140px;
color: white;
selection-background-color: #5e5e5e;
border-radius: 7px; /* закруглёные углы */
}
QComboBox::hover {
background-color: #5e5e5e;
}
QComboBox::drop-down {
border: none;
}
QComboBox::down-arrow {
/* поставьте свои картинки */
image: url(D:/_Qt/img/stylesheet-branch-closed.png);
width: 25px;
height: 25px;
border-width: 0px;
padding-right: 10px;
}
QComboBox::down-arrow:pressed {
/* поставьте свои картинки */
image: url(D:/_Qt/img/stylesheet-branch-open.png);
background-color: #fff;
}
QListView {
font: 12pt Fira Sans Condensed;
background-color: #2e2e2e;
outline: 0;
color: white;
selection-background-color: #5e5e5e;
}
QListView::item {
min-height: 20px;
padding: 5%;
}
QLabel {
color: rgb(255, 255, 255);
font: 15pt Fira Sans Condensed;
}
'''
StyleSheet = '''
QComboBox {
border: 2px solid gray;
border-radius: 3px;
padding: 1px 18px 1px 3px;
min-width: 6em;
}
QComboBox:editable {
background: white;
}
QComboBox:!editable, QComboBox::drop-down:editable {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);
}
/* QComboBox получает состояние `on`, когда всплывающее окно открыто */
QComboBox:!editable:on, QComboBox::drop-down:editable:on {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #D3D3D3, stop: 0.4 #D8D8D8,
stop: 0.5 #DDDDDD, stop: 1.0 #E1E1E1);
}
QComboBox:on { /* сдвиньте текст, когда всплывающее окно откроется */
padding-top: 3px;
padding-left: 4px;
}
QComboBox::drop-down {
subcontrol-origin: padding;
subcontrol-position: top right;
width: 15px;
border-left-width: 1px;
border-left-color: darkgray;
border-left-style: solid;
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
}
QComboBox::down-arrow {
image: url(D:/_Qt/img/stylesheet-branch-closed.png); /* <<=====< */
}
QComboBox::down-arrow:on {
top: 1px;
left: 1px;
image: url(D:/_Qt/img/stylesheet-branch-open.png); /* <<=====< */
}
QComboBox QAbstractItemView {
border: 2px solid darkgray;
selection-background-color: lightgray;
}
QComboBox QListView {
color: palette(shadow);
border: none; /*5px solid red;
selection-background-color: lightgray;*/
}
/* ===================== QScrollBar ======================= */
QScrollBar:vertical
{
background-color: #2A2929;
width: 15px;
margin: 15px 3px 15px 3px;
border: 1px transparent #2A2929;
border-radius: 4px;
}
QScrollBar::handle:vertical
{
background-color: red;
min-height: 5px;
border-radius: 4px;
}
QScrollBar::sub-line:vertical
{
margin: 3px 0px 3px 0px;
border-image: url(./images/up_arrow_disabled.png);
height: 10px;
width: 10px;
subcontrol-position: top;
subcontrol-origin: margin;
}
QScrollBar::add-line:vertical
{
margin: 3px 0px 3px 0px;
border-image: url(./images/down_arrow_disabled.png);
height: 10px;
width: 10px;
subcontrol-position: bottom;
subcontrol-origin: margin;
}
QScrollBar::sub-line:vertical:hover,QScrollBar::sub-line:vertical:on
{
border-image: url(./images/up_arrow.png);
height: 10px;
width: 10px;
subcontrol-position: top;
subcontrol-origin: margin;
}
QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on
{
border-image: url(./images/down_arrow.png);
height: 10px;
width: 10px;
subcontrol-position: bottom;
subcontrol-origin: margin;
}
QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical
{
background: none;
}
QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical
{
background: none;
}
'''
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
app.setStyleSheet(StyleSheet) # (CSS)
w = Widget()
w.show()
sys.exit(app.exec_())

