Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我如何创建一个QVector或其他可以包含不同小部件的容器?_C++_Qt_Qt5_Qwidget_Qvector - Fatal编程技术网

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。但是当然也有例外。嗨,它现在可以工作了!再次感谢您的大力帮助!