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");

Поскольку ваша сетка имеет указатели на виджеты

Другие вопросы по тегам