QT 将小部件投射到组合框

QT cast a widget to a combobox

本文关键字:组合 小部 QT      更新时间:2023-10-16

我有一个小部件表[][],根据我拥有的值,我将把该小部件实例化为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)));
}

因此,在执行后的小部件中,我看到了所有组合框,但没有看到值(未添加任何项目(

附注:这是关于数独游戏的。如果有很多多个值,那么我会创建一个包含所有可能值的组合框,否则创建一个具有单个值的 QLabel。

问题出在这一行:

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

而不是:

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

用:

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

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