正确更新包含QLabel的QScrollArea动态移除

问题描述 投票:0回答:0

我正在开发一个时间线编辑器,其中包含由 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);

我可以调用什么方法(或者我应该更改被调用方法的顺序......)以获得我之前讨论过的正确显示?

c++ qt qlabel qscrollarea
© www.soinside.com 2019 - 2024. All rights reserved.