C++ 我如何创建一个QVector或其他可以包含不同小部件的容器?
C++ 我如何创建一个QVector或其他可以包含不同小部件的容器?,c++,qt,qt5,qwidget,qvector,C++,Qt,Qt5,Qwidget,Qvector,我正在用Qt5开发一个GUI,在这个GUI的主窗口中,它至少包含4个选项卡小部件,每个选项卡小部件将包含几个不同的子QWidget,如QLineEdit、QSpinBox、QLCDnumber等。然后当我打开选项卡时,它的所有子部件都将出现 因此,对于每个选项卡,我决定创建一个QVector(或另一个容器类型)来包含其所有子窗口小部件,例如: QVector-wids; 对于第一个选项卡小部件,如果它有以下子项: QLineEdit*line=新的QLineEdit(此); QLCDNAME*
我正在用Qt5开发一个GUI,在这个GUI的主窗口中,它至少包含4个选项卡小部件,每个选项卡小部件将包含几个不同的子QWidget,如QLineEdit、QSpinBox、QLCDnumber等。然后当我打开选项卡时,它的所有子部件都将出现 因此,对于每个选项卡,我决定创建一个QVector(或另一个容器类型)来包含其所有子窗口小部件,例如:
QVector-wids;
对于第一个选项卡小部件,如果它有以下子项:
QLineEdit*line=新的QLineEdit(此);
QLCDNAME*lcd=新的QLCDNAME(此);
QSpinBox*spn=新QSpinBox(本);
那么我想怎么做呢
wids.append(行);
wids.append(液晶显示器);
追加(spn);
接下来,我想操作选项卡内的每个小部件,例如:
wids[0]->setText(“好”);
wids[1]->显示器(1);
wids[2]>setRange(0,10);
我知道我需要使用dynamic_cast,但我不知道怎么做,有人能给我一些建议吗
非常感谢
QLineEdit
,QLCDNumber
和QSpinBox
已经从QWidget
继承。因此,如果你把它们放在QVector
(或者任何容器,可以是std::vector
)中,你必须处理QWidget
指针
正如你正确指出的:
wids.向后推(行);
wids.推回(lcd);
wids.推回(spn);
要返回各自的类,例如QLineEdit
返回,您需要从QWidget
向下转换到QLineEdit
,QLCDNumber
或从QWidget
继承的任何内容
QLineEdit*line=dynamic_cast(wids[0]);
当然,这假设您确切地知道对象位于哪个位置。当然,您可以测试您的演员阵容是否成功:
if(line==nullptr)
{
//强制转换失败,wids[0]无效或不是从QWidget派生的
}
其他的
{
//强制转换成功,请使用“行”作为常规QLineEdit。
}
一艘班轮虽然非常不安全,但可能是:
dynamic_cast(wids[0])->setText(“myText”);
“我知道我需要使用动态\u cast”。当你知道这一点时,你知道你的设计被破坏了,是时候重新思考了。为什么你首先需要一个矢量的小部件?很高兴我能帮上忙。你可以在这里阅读更多关于演员的信息:你好!“很抱歉打扰您!我发现了一个问题,当我想在选项卡中添加一个QSlider时,我无法将它附加到我的QVector wids中,因为QSlider继承自QAbstractSlider,而QAbstractSlider继承自QObjects,我试图创建一个QVector wids,因为所有小部件都继承自QObject,所以它不起作用,”他说“从'QObject*'到'QWidget*'的转换无效”,这意味着我需要做两次向下广播?您可以始终使用QObject*作为向量的模板类型。因此,代替QVector,可以尝试使用QVector,因为几乎所有小部件都继承自QObject。但是当然也有例外。嗨,它现在可以工作了!再次感谢您的大力帮助!