QT приведение виджета к комбинированному списку
У меня есть таблица [][] виджетов, и в зависимости от имеющегося у меня значения я буду создавать экземпляр этого виджета для QLabel или QCombobox.
QWidget *tab[9][9];
if(modele->firstvalue(i,j) ==0) {
tab[i][j]= new QComboBox();
tab[i][j]->setStyleSheet("border: 1px solid red");
((QComboBox)tab[i][j]).addItem("Test");
}
else {
tab[i][j] = new QLabel(QString::number(modele->firstvalue(i,j)));
}
Таким образом, в моем виджете после выполнения я вижу все выпадающие списки, но не со значениями (элементы не добавлены)
PS: речь идет об игре судоку. Если значений много, я создаю комбинированный список со всеми возможными значениями, в противном случае QLabel с одним значением.
2 ответа
Проблема в этой строке:
((QComboBox)tab[i][j]).addItem("Test");
Это немного запутано из-за актерского состава. Если бы вы использовали приведение C++, вы бы написали:
static_cast<QComboBox>(tab[i][j]).addItem("Test");
static_cast
является избыточным синтаксисом, и теперь очевидно, что код означает:
QComboBox(tab[i][j]).addItem("Test");
Как видите, вы создаете временное поле со списком tab[i][j]
как родитель, затем добавление элемента к нему и немедленное уничтожение его при выходе из области действия. Исходное поле со списком, которое вы создали на 3 строки выше, здесь не изменяется.
Вместо этого вам нужно написать (не используйте приведение в стиле C в C++):
static_cast<QComboBox*>(tab[i][j])->addItem("Test");
В идеале, напишите код, чтобы вам вообще не понадобилось приведение:
auto box = new QComboBox;
box->setStyleSheet("border: 1px solid red");
box->addItem("Test");
tab[i][j] = box;
Вместо:
((QComboBox)tab[i][j]).addItem("Test");
использовать:
((QComboBox*)tab[i][j]).addItem("Test");
Поскольку ваша сетка имеет указатели на виджеты