Qtabwidget 每个标签标题背景色
Qt TabWidget Each tab Title Background Color
这是没有设置标题背景颜色的原始Tabwidget
我的客户要求我做这样的事情;
为标题设置不同的背景颜色
All - Yellow
purchase - light blue
POS Sales - light green
Cash Sales - Pink
invoice - light purple
我尝试过 SetStyleSheet,例如:
QTabBar {
background-color : Yellow;
}
但是所有标签颜色都变了
有人知道如何设置每个 QTabBar 背景颜色吗?
无法通过 QSS 设置这些属性。要更改每个选项卡的样式,我们必须创建自定义 QTabBar
并覆盖其 paintEvent
方法,以便能够更改每个选项卡的样式,我们使用 QStyleOptionTab
class , 但要更改 QTabWidget
标签栏,我们需要使用 setTabBar
方法,但这是私有的,因此您需要创建自定义 QTabWidget
,如下所示:
tabwidget.h
#ifndef TABWIDGET_H
#define TABWIDGET_H
#include <QStyleOptionTab>
#include <QStylePainter>
#include <QTabWidget>
class TabBar: public QTabBar
{
public:
TabBar(const QHash<QString, QColor> &colors, QWidget *parent=0):QTabBar(parent){
mColors = colors;
}
protected:
void paintEvent(QPaintEvent */*event*/){
QStylePainter painter(this);
QStyleOptionTab opt;
for(int i = 0;i < count();i++)
{
initStyleOption(&opt,i);
if(mColors.contains(opt.text)){
opt.palette.setColor(QPalette::Button, mColors[opt.text]);
}
painter.drawControl(QStyle::CE_TabBarTabShape, opt);
painter.drawControl(QStyle::CE_TabBarTabLabel,opt);
}
}
private:
QHash<QString, QColor> mColors;
};
class TabWidget : public QTabWidget
{
public:
TabWidget(QWidget *parent=0):QTabWidget(parent){
// text - color
QHash <QString, QColor> dict;
dict["All"] = QColor("yellow");
dict["purchase"] = QColor("#87ceeb");
dict["POS Sales"] = QColor("#90EE90");
dict["Cash Sales"] = QColor("pink");
dict["invoice"] = QColor("#800080");
setTabBar(new TabBar(dict));
}
};
#endif // TABWIDGET_H
要在 Qt Designer 中的 QTabWidget 中使用它,应该为此提升我们右键单击 tabwidget 和 select 菜单 Promoted Widgets,在我的例子中,前面的代码是在文件中创建的 tabwidget.h 所以这将是头文件,在 Promoted Class Name 的情况下,我们使用 TabWidget,之后我们按下按钮 Add 和 Promote 获得下图中显示的内容:
最终结果如下图所示:
完整的例子可以在下面找到link
Python:
from PyQt5 import QtGui, QtWidgets
class TabBar(QtWidgets.QTabBar):
def __init__(self, colors, parent=None):
super(TabBar, self).__init__(parent)
self.mColors = colors
def paintEvent(self, event):
painter = QtWidgets.QStylePainter(self)
opt = QtWidgets.QStyleOptionTab()
for i in range(self.count()):
self.initStyleOption(opt, i)
if opt.text in self.mColors:
opt.palette.setColor(
QtGui.QPalette.Button, self.mColors[opt.text]
)
painter.drawControl(QtWidgets.QStyle.CE_TabBarTabShape, opt)
painter.drawControl(QtWidgets.QStyle.CE_TabBarTabLabel, opt)
class TabWidget(QtWidgets.QTabWidget):
def __init__(self, parent=None):
super(TabWidget, self).__init__(parent)
d = {
"All": QtGui.QColor("yellow"),
"purchase": QtGui.QColor("#87ceeb"),
"POS Sales": QtGui.QColor("#90EE90"),
"Cash Sales": QtGui.QColor("pink"),
"invoice": QtGui.QColor("#800080"),
}
self.setTabBar(TabBar(d))
self.addTab(QtWidgets.QLabel(), "All")
self.addTab(QtWidgets.QLabel(), "purchase")
self.addTab(QtWidgets.QLabel(), "POS Sales")
self.addTab(QtWidgets.QLabel(), "Cash Sales")
self.addTab(QtWidgets.QLabel(), "invoice")
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
app.setStyle("fusion")
w = TabWidget()
w.show()
sys.exit(app.exec_())
这是没有设置标题背景颜色的原始Tabwidget
我的客户要求我做这样的事情; 为标题设置不同的背景颜色
All - Yellow
purchase - light blue
POS Sales - light green
Cash Sales - Pink
invoice - light purple
我尝试过 SetStyleSheet,例如:
QTabBar {
background-color : Yellow;
}
但是所有标签颜色都变了 有人知道如何设置每个 QTabBar 背景颜色吗?
无法通过 QSS 设置这些属性。要更改每个选项卡的样式,我们必须创建自定义 QTabBar
并覆盖其 paintEvent
方法,以便能够更改每个选项卡的样式,我们使用 QStyleOptionTab
class , 但要更改 QTabWidget
标签栏,我们需要使用 setTabBar
方法,但这是私有的,因此您需要创建自定义 QTabWidget
,如下所示:
tabwidget.h
#ifndef TABWIDGET_H
#define TABWIDGET_H
#include <QStyleOptionTab>
#include <QStylePainter>
#include <QTabWidget>
class TabBar: public QTabBar
{
public:
TabBar(const QHash<QString, QColor> &colors, QWidget *parent=0):QTabBar(parent){
mColors = colors;
}
protected:
void paintEvent(QPaintEvent */*event*/){
QStylePainter painter(this);
QStyleOptionTab opt;
for(int i = 0;i < count();i++)
{
initStyleOption(&opt,i);
if(mColors.contains(opt.text)){
opt.palette.setColor(QPalette::Button, mColors[opt.text]);
}
painter.drawControl(QStyle::CE_TabBarTabShape, opt);
painter.drawControl(QStyle::CE_TabBarTabLabel,opt);
}
}
private:
QHash<QString, QColor> mColors;
};
class TabWidget : public QTabWidget
{
public:
TabWidget(QWidget *parent=0):QTabWidget(parent){
// text - color
QHash <QString, QColor> dict;
dict["All"] = QColor("yellow");
dict["purchase"] = QColor("#87ceeb");
dict["POS Sales"] = QColor("#90EE90");
dict["Cash Sales"] = QColor("pink");
dict["invoice"] = QColor("#800080");
setTabBar(new TabBar(dict));
}
};
#endif // TABWIDGET_H
要在 Qt Designer 中的 QTabWidget 中使用它,应该为此提升我们右键单击 tabwidget 和 select 菜单 Promoted Widgets,在我的例子中,前面的代码是在文件中创建的 tabwidget.h 所以这将是头文件,在 Promoted Class Name 的情况下,我们使用 TabWidget,之后我们按下按钮 Add 和 Promote 获得下图中显示的内容:
最终结果如下图所示:
完整的例子可以在下面找到link
Python:
from PyQt5 import QtGui, QtWidgets
class TabBar(QtWidgets.QTabBar):
def __init__(self, colors, parent=None):
super(TabBar, self).__init__(parent)
self.mColors = colors
def paintEvent(self, event):
painter = QtWidgets.QStylePainter(self)
opt = QtWidgets.QStyleOptionTab()
for i in range(self.count()):
self.initStyleOption(opt, i)
if opt.text in self.mColors:
opt.palette.setColor(
QtGui.QPalette.Button, self.mColors[opt.text]
)
painter.drawControl(QtWidgets.QStyle.CE_TabBarTabShape, opt)
painter.drawControl(QtWidgets.QStyle.CE_TabBarTabLabel, opt)
class TabWidget(QtWidgets.QTabWidget):
def __init__(self, parent=None):
super(TabWidget, self).__init__(parent)
d = {
"All": QtGui.QColor("yellow"),
"purchase": QtGui.QColor("#87ceeb"),
"POS Sales": QtGui.QColor("#90EE90"),
"Cash Sales": QtGui.QColor("pink"),
"invoice": QtGui.QColor("#800080"),
}
self.setTabBar(TabBar(d))
self.addTab(QtWidgets.QLabel(), "All")
self.addTab(QtWidgets.QLabel(), "purchase")
self.addTab(QtWidgets.QLabel(), "POS Sales")
self.addTab(QtWidgets.QLabel(), "Cash Sales")
self.addTab(QtWidgets.QLabel(), "invoice")
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
app.setStyle("fusion")
w = TabWidget()
w.show()
sys.exit(app.exec_())