QT将小部件转换为组合框

时间:2017-03-29 17:46:03

标签: c++ qt qwidget qcombobox

我有一个小窗口的表[] [],根据我拥有的值,我将把小部件实例化为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 个答案:

答案 0 :(得分:4)

问题出在这一行:

((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;

答案 1 :(得分:0)

而不是:

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

使用:

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

由于你的网格有指向小部件的指针