Как я могу создать QVector или другой контейнер, который может содержать разные виджеты? - PullRequest
2 голосов
/ 23 октября 2019


Я разрабатываю графический интерфейс с Qt5, и в главном окне этого графического интерфейса он содержит как минимум 4 виджета со вкладками, и каждый виджет со вкладками будет содержать несколько дочерних QWidget, например:QLineEdit, QSpinBox, QLCDnumber и т. Д. Затем, когда я открою вкладку, появятся все ее дочерние виджеты.

Таким образом, для каждой вкладки я решил создать QVector (или другой тип контейнера), который будет содержать вседочерние виджеты, например:

QVector<QWidget*> wids;

для виджета первой вкладки, если у него есть следующие дочерние элементы:

QLineEdit* line=new QLineEdit(this);
QLCDNumber* lcd=new QLCDNumber(this);
QSpinBox* spn=new QSpinBox(this);

, тогда каким-то образом я бы хотел сделать

wids.append(line);
wids.append(lcd);
wids.append(spn);

и далее я хочу управлять каждым виджетом на вкладке, например:

wids[0]->setText("good");
wids[1]->display(1);
wids[2]->setRange(0,10);

Я знаю, что мне нужно использовать dynamic_cast <...> , но яНЕ ЗНАЕТЕ, как это сделать, может ли кто-нибудь дать мне какой-нибудь совет?

большое спасибо!

1 Ответ

3 голосов
/ 23 октября 2019

QLineEdit, QLCDNumber и QSpinBox уже наследуются от QWidget. Поэтому, если вы поместите их в QVector (или в любой другой контейнер, например, std::vector<QWidget*>), вам придется иметь дело с QWidget указателями.

Как вы правильно сказали:

wids.push_back(line);
wids.push_back(lcd);
wids.push_back(spn);

Чтобы вернуть ваши соответствующие классы, например, QLineEdit, вам нужно понизить с QWidget до QLineEdit, QLCDNumber или что-либо еще, наследуемое от QWidget.

QLineEdit * line = dynamic_cast<QLineEdit*>(wids[0]);

Это, конечно, предполагает, что вы точно знаете, в каком положении находится объект. Конечно, вы можете проверить, успешен ли ваш бросок:

if( line == nullptr )
{
    // cast failed, either wids[0] is invalid or does not derive from QWidget
}

else
{
    // cast was successful, use 'line' as regular QLineEdit.
}

Однострочник, хотя и небезопасный, но будет:

dynamic_cast<QLineEdit*>(wids[0])->setText("myText");
...