在 Qt 中动态更改小部件的方法
change methods to widgets dynamically in Qt
我是 Qt 的新手,我尝试迭代 10 个控件和 show/hide 它们。
switch (id)
{
case 1:
ui->lblSinglePulse1->hide();
ui->pbSinglePulse1->hide();
break;
case 2:
ui->lblSinglePulse2->hide();
ui->pbSinglePulse2->hide();
break;
case 3:
ui->lblSinglePulse3->hide();
ui->pbSinglePulse3->hide();
break;
case 4:
... and so on
我确信还有另一种动态传递小部件名称的方法。
例如:
ui->getWidgetByName("lblSinglePulse" + "2" )->隐藏();
或其他...
请你帮忙。
来自 @Mat 评论
您需要先将所有控件添加到列表中,像这样
lblSinglePulseList.append(ui->lblSinglePulse1);
lblSinglePulseList.append(ui->lblSinglePulse2);
lblSinglePulseList.append(ui->lblSinglePulse3);
...
pblSinglePulseList.append(ui->pblSinglePulse1);
pblSinglePulseList.append(ui->pblSinglePulse2);
pblSinglePulseList.append(ui->pblSinglePulse3);
然后在你的函数中使用列表
lblSinglePulseList[id - 1]->hide();
pblSinglePulseList[id - 1]->hide();
已编辑:
如果 ui->lblSinglePulse1 的类型是 Lable 并且 ui->pbSinglePulse1 的类型是 PushButton,则列表初始化为:
QList<Lable *> lblSinglePulseList;
QList<PushButton *> pblSinglePulseList;
我想你可以用这样的地图来做:
头文件。
class YourClass
{
public:
// ...
private:
void setHidden( const int aIndex, const bool aHidden );
void setAllVisible();
private:
QMap< int, QList< QWidget* > > m_Widgets; // This shall be a member of your class.
};
源文件。
YourClass::YourClass()
{
m_Widgets[ 0 ] << ui->lblSinglePulse1;
m_Widgets[ 0 ] << ui->pblSinglePulse1;
m_Widgets[ 1 ] << ui->lblSinglePulse2;
m_Widgets[ 1 ] << ui->pblSinglePulse3;
// And so ...
}
// To hide widgets at a given index.
void YourClass::setHidden( const int aIndex, const bool aHidden)
{
// First you need to set all items visible otherwise the result won't be the desired ... I think.
setAllVisible();
for ( auto item : m_Widgets[ aIndex ] )
{
item->setHidden( aHidden );
}
}
void YourClass::setAllVisible()
{
for ( auto items : m_Widgets )
{
for ( auto item : items )
{
item->setVisible( true );
}
}
}
我是 Qt 的新手,我尝试迭代 10 个控件和 show/hide 它们。
switch (id)
{
case 1:
ui->lblSinglePulse1->hide();
ui->pbSinglePulse1->hide();
break;
case 2:
ui->lblSinglePulse2->hide();
ui->pbSinglePulse2->hide();
break;
case 3:
ui->lblSinglePulse3->hide();
ui->pbSinglePulse3->hide();
break;
case 4:
... and so on
我确信还有另一种动态传递小部件名称的方法。 例如: ui->getWidgetByName("lblSinglePulse" + "2" )->隐藏(); 或其他...
请你帮忙。
来自 @Mat 评论
您需要先将所有控件添加到列表中,像这样
lblSinglePulseList.append(ui->lblSinglePulse1);
lblSinglePulseList.append(ui->lblSinglePulse2);
lblSinglePulseList.append(ui->lblSinglePulse3);
...
pblSinglePulseList.append(ui->pblSinglePulse1);
pblSinglePulseList.append(ui->pblSinglePulse2);
pblSinglePulseList.append(ui->pblSinglePulse3);
然后在你的函数中使用列表
lblSinglePulseList[id - 1]->hide();
pblSinglePulseList[id - 1]->hide();
已编辑:
如果 ui->lblSinglePulse1 的类型是 Lable 并且 ui->pbSinglePulse1 的类型是 PushButton,则列表初始化为:
QList<Lable *> lblSinglePulseList;
QList<PushButton *> pblSinglePulseList;
我想你可以用这样的地图来做:
头文件。
class YourClass
{
public:
// ...
private:
void setHidden( const int aIndex, const bool aHidden );
void setAllVisible();
private:
QMap< int, QList< QWidget* > > m_Widgets; // This shall be a member of your class.
};
源文件。
YourClass::YourClass()
{
m_Widgets[ 0 ] << ui->lblSinglePulse1;
m_Widgets[ 0 ] << ui->pblSinglePulse1;
m_Widgets[ 1 ] << ui->lblSinglePulse2;
m_Widgets[ 1 ] << ui->pblSinglePulse3;
// And so ...
}
// To hide widgets at a given index.
void YourClass::setHidden( const int aIndex, const bool aHidden)
{
// First you need to set all items visible otherwise the result won't be the desired ... I think.
setAllVisible();
for ( auto item : m_Widgets[ aIndex ] )
{
item->setHidden( aHidden );
}
}
void YourClass::setAllVisible()
{
for ( auto items : m_Widgets )
{
for ( auto item : items )
{
item->setVisible( true );
}
}
}