如果鼠标位于栏的填充部分之上,如何更改QProgressBar
的颜色和/或文本(格式)?
我已将多个QProgressBar
叠加在一起,每个都显示比以前更多的内容。
我想在鼠标悬停时突出鼠标下方最大的条形图,并显示一些特定于条形的文本。但是,条形尺寸相同,因此我想识别条形的填充区域。
例如,如果鼠标位于第三个栏上方,我想突出显示从左侧到第三个栏的部分,并显示特定于第三个栏的文本。
这是我用于堆叠ProgressBars的代码:
class MultiProgressBar : public QWidget
{
Q_OBJECT
public:
MultiProgressBar( QWidget* parent = Q_NULLPTR ) : QWidget( parent ), layout( new QStackedLayout( this ) )
{
layout->setMargin( 0 );
layout->setStackingMode( QStackedLayout::StackAll );
}
void insertBar( QColor const& color )
{
auto bar = new QProgressBar();
bar->setTextVisible( false );
bar->setRange( 0, 10000 );
QPalette palette = this->palette();
palette.setColor( QPalette::Highlight, QColor( color.red(), color.green(), color.blue(), 100 ) );
palette.setColor( QPalette::Base, QColor( color.red(), color.green(), color.blue(), 0 ) );
bar->setPalette( palette );
layout->addWidget( bar );
progress_bars.push_back( bar );
}
public slots:
void setValues( const std::vector< int >& values, const std::vector< std::string >& names )
{
if ( values.size() < progress_bars.size() )
{
for ( auto* widget : progress_bars )
{
layout->removeWidget( widget );
}
progress_bars.clear();
}
while ( progress_bars.size() < values.size() )
{
insertBar( QColor( 0x46, 0xA1, 0xD9, 255 ) );
}
for ( auto i = 0; i < progress_bars.size(); ++i )
{
progress_bars[ i ]->setValue( values[ i ] );
// progress_bars[ i ]->setFormat( QString::fromStdString( names[ i ] ) );
}
}
private:
std::vector< QProgressBar* > progress_bars;
QStackedLayout* layout;
};
答案 0 :(得分:2)
1)要更改填充区域的颜色,您可以将新颜色设置为进度条的调色板,如下所示:
QPalette newPalette = bar.palette();
newPalette.setColor(QPalette::Highlight, "red"); // setting color to red
bar.setPalette(newPalette);
2.1)使用void setFormat(const QString &format);
函数将文本分配给进度条,就像在注释字符串
progress_bars[ i ]->setFormat( QString::fromStdString( names[ i ] ) );
2.2)通过调用QProgressBar::text()
函数
3)如果您想突出显示特定的进度条,可以重新实现
QWidget::mouseMoveEvent(QMouseEvent *event);
您可以在其中计算填充区域的边距:
void mouseMoveEvent(QMouseEvent *e){
highlightProgressBars(e->pos()); // passing position of mouse cursor
}
注意:不要忘记为进度条和MultiProgressBar
小部件启用鼠标跟踪:
bar->setMouseTracking(true);
4)下面的功能获取鼠标在参数中的位置。它突出显示从左侧到尖头进度条的区域,并在通过format
属性分配给突出显示的进度条的控制台文本中显示
void highlightProgressBars(QPoint point){
int widthOfBar = ((QProgressBar*)progress_bars.at(0))->width();
int valueForPoint = 10000 / widthOfBar; // value of progressbar for width==1
for (auto pb = this->progress_bars.begin(); pb != this->progress_bars.end(); ++pb) { // iterating vector to paint progressbars
int leftMargin = 0; // "left margin" of current progressbar is in fact right margin of filled area of previous progressbar
if(pb != this->progress_bars.begin()){ // except first progressbar in vector which doesn't have previous progressbar
--pb; // get previous progressbar
leftMargin = ((QProgressBar*)*pb)->value() / valueForPoint; // get width of filled area
++pb; // return to current progressbar
}
if(leftMargin < point.x()) { // if position of cursor is to the right of "left margin" of current progressbar we highlight it
QPalette newPal = ((QProgressBar*)*pb)->palette(); //getting palette
newPal.setColor(QPalette::Highlight,"red"); // and setting color of filled area
((QProgressBar*)*pb)->setPalette(newPal); // finally setting palette to widget
qDebug() << ((QProgressBar*)*pb)->text(); // show text of highlighted progressbar in console
}
else{ // if not we highlight it another way
QPalette newPal = ((QProgressBar*)*pb)->palette();
newPal.setColor(QPalette::Highlight,"lightblue");
((QProgressBar*)*pb)->setPalette(newPal);
}
}
}
如果您只想突出显示一个进度条,则应在上面的代码中进行更改:
if(leftMargin < point.x()) {
为:
int rightMargin = ((QProgressBar*)*pb)->value() / valueForPoint;
if(leftMargin < point.x() && point.x() < rightMargin) {