从QGridLayout删除一行

Con*_*tin 5 c++ qt

总之,我保持QGridLayoutQLabels,其表现出多项式的系数.我代表我的多项式使用QList<double>.

每次更新系数时,我都会更新标签.当改变列表的大小,我的方法没有效果很好. QGridLayout::rowCount()没有正确更新.我想知道是否有办法从QGridLayout中删除行.


代码如下,QGridLayout用更多(或更少)更新大小QLabels

int count = coefficients->count(); //coefficients is a QList<double> *
if(count != (m_informational->rowCount() - 1)) //m_information is a QGridLayout
{
    SetFitMethod(0);
    for(int i = 0; i < count; ++i)
    {
        QLabel * new_coeff = new QLabel(this);
        new_coeff->setAlignment(Qt::AlignRight);
        m_informational->addWidget(new_coeff, i+1, 0);
        QLabel * param = new QLabel(this);
        param->setAlignment(Qt::AlignLeft);
        param->setText(QString("<b><i>x</i><sup>%2</sup></b>").arg(count-i-1));
        m_informational->addWidget(param, i+1, 1);
        QSpacerItem * space = new QSpacerItem(0,0,QSizePolicy::Expanding);
        m_informational->addItem(space, i+1, 1);
    }

    m_informational->setColumnStretch(0, 3);
    m_informational->setColumnStretch(1, 1);
    m_informational->setColumnStretch(2, 1);
}
Run Code Online (Sandbox Code Playgroud)

SetFitMethod(这是一个初始模型)

void SetFitMethod(int method)
{
    ClearInformational();
    switch(method)
    {
    case 0: //Polynomial fit
        QLabel * title = new QLabel(this);
        title->setText("<b> <u> Coefficients </u> </b>");
        title->setAlignment(Qt::AlignHCenter);
        m_informational->addWidget(title,0,0,1,3, Qt::AlignHCenter);
    }
}
Run Code Online (Sandbox Code Playgroud)

清算方法:

void ClearInformational()
{
    while(m_informational->count())
    {
        QLayoutItem * cur_item = m_informational->takeAt(0);
        if(cur_item->widget())
            delete cur_item->widget();
        delete cur_item;
    }
}
Run Code Online (Sandbox Code Playgroud)

RA.*_*RA. 5

问题是它QGridLayout::rowCount()实际上并没有返回您可以看到的行数,它实际上返回QGridLayout内部分配给数据行的行数(是的,这不是很明显,也没有记录)。

为了解决这个问题,您可以删除QGridLayout并重新创建它,或者如果您确信您的列数不会改变,您可以执行以下操作:

int rowCount = m_informational->count()/m_informational->columnCount();
Run Code Online (Sandbox Code Playgroud)