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 с одним значением.


person Uncle Sam    schedule 29.03.2017    source источник


Ответы (2)


Проблема именно в этой строке:

((QComboBox)tab[i][j]).addItem("Test");

Это немного запутано из-за приведения C. Если бы вы использовали приведение 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;
person Kuba hasn't forgotten Monica    schedule 29.03.2017
comment
хороший ответ, просто упомянем, что есть также специальное приведение Qt: qobject_cast, который следует использовать для динамических приведений на основе QObject. в данном случае qobject_cast<QComboBox*>(tab[i][j])->addItem("Test"); - person xander; 30.03.2017
comment
@xander qobject_cast - это альтернатива dynamic_cast, а не какое-то общее использование для QObject. Когда тип известен, вы должны использовать static_cast, а не dynamic_cast, и, следовательно, не qobject_cast. Ситуация становится еще хуже: когда компилятор может вывести статический тип, dynamic_cast может быть повышен до статического приведения. Когда вы используете qobject_cast, эта оптимизация невозможна. TL;DR Используйте static_cast, когда можете, и dynamic_cast, только если не можете. - person Kuba hasn't forgotten Monica; 30.03.2017
comment
@xander A qobject_cast - это оптимизация по сравнению с dynamic_cast при работе с типами, которые, как вы уверены, компилятор не сможет разрешить во время компиляции, и становится необходимым при компиляции без RTTI. - person Kuba hasn't forgotten Monica; 30.03.2017

Вместо:

((QComboBox)tab[i][j]).addItem("Test");

использовать:

((QComboBox*)tab[i][j]).addItem("Test");

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

person Roberto    schedule 29.03.2017