【问题标题】:QT cast a widget to a comboboxQT 将小部件转换为组合框
【发布时间】:2017-03-29 17:46:02
【问题描述】:

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

【问题讨论】:

    标签: c++ qt qwidget qcombobox


    【解决方案1】:

    问题出在这一行:

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

    由于 C 转换,它有点混淆了。如果你使用了 C++ cast,你会写:

    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;
    

    【讨论】:

    • 好答案,顺便提一下,还有一个特殊的 Qt 演员表:qobject_cast,应该用于基于 QObject 的动态演员表。在这种情况下qobject_cast&lt;QComboBox*&gt;(tab[i][j])-&gt;addItem("Test");
    • @xander qobject_castdynamic_cast 的替代品,而不是一般的“用于QObject 演员表”。当类型已知时,您应该使用static_cast,而不是dynamic_cast,因此也不是qobject_cast。更糟的是:当编译器可以推断出静态类型时,dynamic_cast 可以提升为静态类型转换。当您使用qobject_cast 时,无法进行此优化。 TL;DR 尽可能使用static_cast,仅在不能使用时使用dynamic_cast
    • @xander A qobject_cast 是对dynamic_cast 的优化,在处理您确定编译器将无法在编译时解析的类型时,并且在没有 RTTI 的情况下进行编译时变得必要。
    【解决方案2】:

    代替:

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

    使用:

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

    因为您的网格有指向小部件的指针

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多