进度条委托上的自定义颜色
Customized color on progressbar delegate
尝试这样做一段时间,并从我能找到的每个论坛帖子中获取建议,但我仍然无法解决它。这是我当前的代码,我真的很想更改进度条上块的颜色。除颜色外,所有其他设置都有效。
在我的工作区对象中,它填充了主窗口上的一个子视图。
Workspace::Workspace( QWidget* parent) : QWidget( parent )
{
QTableView* tableView = new QTableView();
// ...
tableView->setItemDelegate(new ProgressBarDelegate);
}
委托.cpp如下所示:
ProgressBarDelegate::ProgressBarDelegate( QObject* parent )
: QStyledItemDelegate(parent)
{
}
void ProgressBarDelegate::paint( QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
if (index.column() == 2)
{
int progressPercentage = index.model()->data(index, Qt::DisplayRole).toInt();
QStyleOptionProgressBarV2 progressBarOption;
progressBarOption.rect = QRect(option.rect.x(), option.rect.y() + 5 , option.rect.width(), option.rect.height() / 1.5);
progressBarOption.minimum = 0;
progressBarOption.maximum = 100;
progressBarOption.progress = progressPercentage;
QPalette pal = progressBarOption.palette;
QColor col = QColor(35, 35,25);
pal.setColor(QPalette::Highlight, col); // or QPalette::Window doesnt matter
progressBarOption.palette = pal;
if(option.state & QStyle::State_Selected)
{
}
QApplication::style()->drawControl( QStyle::CE_ProgressBar,
&progressBarOption,
painter);
}
else
{
QStyledItemDelegate::paint(painter, option, index);
}
}
目前,无论我做什么,颜色都不会从OSX标准浅灰色改变。
运行OSX 10.6.7和Qt 4.8.1(如果这很重要(。 谢谢!
编辑:
我能够做到以下几点:
app.setStyleSheet("QScrollBar:horizontal { border: 2px solid green;background: cyan;height: 15px;margin: 0px 20px 0 20px;}");
但是当我这样做时:
app.setStyleSheet("QProgressBar:horizontal { border: 1px solid gray; border-radius: 3px; background: white; padding: 1px; }");
进度条上没有任何变化。理论上,我不创建任何进度条对象,我只是设置一种样式,如何在委托中查看数据。但可以肯定的是,我不能成为第一个想这样做的人吧?
另外,如果这不起作用,我如何在表格视图中执行此操作(具有样式进度条(?
你应该使用Qt样式表,它允许我们自定义许多控件的UI,以提供跨平台的独特外观。检查这个。
创建一个新的简单Qt Gui项目,打开UI表单编辑器,并从工具窗口中的"显示小部件"下添加一个进度条控件。现在在 MainWindow
的构造函数中编写以下代码。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// Customize progress-bar's style..
QString style = "QProgressBar {border: 2px solid grey; border-radius: 5px; text-align: center;}";
style += "QProgressBar::chunk {background-color: #CD96CD; width: 10px; margin: 0.5px;}";
// Assuming objectName is 'progressBar'..
ui->progressBar->setStyleSheet(style);
}
编译并运行。
如果你只想更改单个QProgressBar
控件,那么上面的方法就足够了,但是如果你想在应用程序级别应用样式(比如所有QProgressBar
控件和其他一些控件(,那么正确的方法是创建一个*.css
文件,使用Qt样式表参考编写样式,然后在Qt中读取该文件并调用
QApplication::setStyleSheet(QString style)
.
此外,样式表使用与CSS相同的语法,并且还支持各种选择器。
编辑:
我同意上述方法仅适用于控件,而不适用于委托。我也为代表们找到了一些东西。尝试遵循paint
函数。
void ProgressBarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if (index.column() == 2)
{
QProgressBar renderer;
int progressPercentage = index.model()->data(index, Qt::DisplayRole).toInt();
// Customize style using style-sheet..
QString style = "QProgressBar { border: 2px solid grey; border-radius: 5px; }";
style += "QProgressBar::chunk { background-color: #05B8CC; width: 20px; }";
renderer.resize(option.rect.size());
renderer.setMinimum(0);
renderer.setMaximum(100);
renderer.setValue(progressPercentage);
renderer.setStyleSheet(style);
painter->save();
painter->translate(option.rect.topLeft());
renderer.render(painter);
painter->restore();
}
else
QStyledItemDelegate::paint(painter, option, index);
}
所以这里的重点是,我们可以直接使用控件本身作为渲染器,而不是使用 QStyleOption
。希望这有帮助..
而不是pal.setColor(QPalette::Window, col);
使用pal.setColor(QPalette::Highlight, col);
这应该work
.
我在 Paintevent 中使用了代码
void Dialog::paintEvent(QPaintEvent *e)
{
QPainter painter(this);
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(ShowPrintDialog()));
QStyleOptionProgressBarV2 progressBarOption;
progressBarOption.rect = QRect(20,20,30,30);
progressBarOption.minimum = 0;
progressBarOption.maximum = 100;
progressBarOption.progress = 75;
QPalette pal = progressBarOption.palette;
QColor col = QColor(0,255,0);
pal.setColor(QPalette::Highlight, col);
progressBarOption.palette = pal;
QApplication::style()->drawControl(QStyle::CE_ProgressBar,&progressBarOption, &painter);
}
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- C++自定义比较函数
- 如何比较自定义类的std::变体
- std::设置自定义比较器
- 如何正确实现和访问运算符的各种自定义枚举器
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 如何为使用创建窗口创建的窗口创建自定义背景颜色
- 图标编辑器中的自定义颜色 (VS 2015)
- 使用 Windows 功能区框架自定义颜色
- 如何在Qt中创建自定义颜色选择器
- 自定义图形列表视图项目不更改文本颜色
- 进度条委托上的自定义颜色
- 如何为特定的单词(如IDE)设置自定义颜色
- 更改自定义文本C++的颜色
- MFC自定义控制背景/文本颜色
- 如何创建带有自定义颜色的中文和日文字符的标签
- Windows 10上本机C++应用程序的自定义标题栏颜色
- 如何获取标题栏窗口控件的 RECT(最大化、最小化、关闭按钮)?我尝试制作自定义颜色标题栏
- 如何在QTextEdit中设置自定义文本颜色