我正在开发一个时间线编辑器,其中包含由 QLabel 表示的曲目。它在 QScrollBar 中。首先默认有第一首曲目,我们可以动态添加和删除曲目。 我遇到的问题是,当剩下低轨道 (3) 并且我删除了其中一个时,这幅画就坏了(请参见下面的 gif 图片)
我尝试了很多东西(也许太多..):
qApp->processEvents()
,update()
,show()
,style()->unpolish(); style()->polish();
以及几乎所有图形元素。
这是我的代码: EditCueTimelineWidget 类是显示的全局小部件是图像 ui->TimelineEditScrollArea 就是 QScrollArea ui->scrollAreaWidgetContents 是影响到scrollArea的QWidget内容 _trackLabelList 是 TrackLabel 的 QVector _subTrackLabelList(对于 TrackLabel)是 SubTrackLabel 的 QVector TrackLabel 和 SubTrackLabel 有一个 _label 成员,它是一个 VerticalLabel(垂直显示名称)和一个 _strip 成员,它是一个橙色或黄色的 QLabel(显示当前选择的轨道或子轨道)
void EditCueTimelineWidget::refreshWidget()
{
qApp->processEvents();
ui->label->refreshTimemarks();
for(auto l :qAsConst(_trackLabelList))
{
l->recenterWidgets();
l->update();
l->show();
}
style()->unpolish(ui->scrollAreaWidgetContents);
style()->polish(ui->scrollAreaWidgetContents);
style()->unpolish(ui->TimelineEditScrollArea);
style()->polish(ui->TimelineEditScrollArea);
style()->unpolish(this);
style()->polish(this);
ui->scrollAreaWidgetContents->update();
ui->TimelineEditScrollArea->update();
update();
ui->scrollAreaWidgetContents->show();
ui->TimelineEditScrollArea->show();
show();
ui->nbTracksLabel->setText(QString::number(_trackLabelList.size())+tr(" Tracks"));
qApp->processEvents();
}
void TrackLabel::recenterWidgets()
{
_label->setFixedSize(50,height());
_label->move(40,0);
_strip->setFixedSize(15, height());
_strip->move(1,1);
int nbSub = _subTrackLabelList.size();
for(int k = 0; k <nbSub ; k++)
{
SubTrackLabel* l = _subTrackLabelList.at(k);
int h = height()/nbSub;
int posY = k * h;
if(k != (nbSub -1))
l->setFixedSize(width() - 100, h);
else
l->setFixedSize(width() - 100, height() - posY);
l->move(100,posY);
l->recenterWidgets();
l->update();
l->show();
}
style()->unpolish(_label);
style()->polish(_label);
style()->unpolish(_strip);
style()->polish(_strip);
style()->unpolish(this);
style()->polish(this);
_label->update();
_strip->update();
_label->show();
_strip->show();
}
void SubTrackLabel::recenterWidgets()
{
_label->setFixedSize(35,height());
_label->move(20,0);
_strip->setFixedSize(12, height());
_strip->move(1,1);
style()->unpolish(_label);
style()->polish(_label);
style()->unpolish(_strip);
style()->polish(_strip);
style()->unpolish(this);
style()->polish(this);
_label->update();
_strip->update();
_label->show();
_strip->show();
}
gif图显示不够...
请注意,我在 EditCueTimelineWidget 上有一个调整大小的 eventFilter,当我手动调整应用程序大小时,我得到了我想要实现的预期结果:最后两个轨道占据了所有空间并正确显示:
bool EditCueTimelineWidget::eventFilter(QObject *, QEvent *event)
{
if (event->type() == QEvent::Resize)
{
refreshWidget();
return true;
}
return false;
}
还要注意在 TrackLabel 构造函数中:
setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred);
setMinimumHeight(300);
我可以调用什么方法(或者我应该更改被调用方法的顺序......)以获得我之前讨论过的正确显示?