如何在运行时指定QComboBox项?

时间:2017-04-07 01:50:33

标签: c++ qt

我有一个QDialog,我在Qt Designer中以图形方式设计。它有一些QComboBox,我想在设计时放入一些占位符文本,然后在运行时加载实际的内容。

当然,我可以让QComboBox创建,然后调用clear(),addItem()来覆盖列表。但是如果这个QComboBox出现在几个地方呢?什么是保持干燥的最好方法?

我认为逻辑方式是子类化QComboBox并在构造函数中设置内容并将Qt Designer中的小部件提升为我的子类。不幸的是,uic调用构造函数很好,但之后不久调用retranslateUi(),用设计时条目替换内容。

我喜欢子类的想法,因为它还允许我在组合框选择改变时抽象出行为,但我看不到确保动态内容生效的方法。

示例子类构造函数:

Sub_QComboBox::Sub_QComboBox(QWidget * parent) : QComboBox(parent)
{
    QStringList entries = getEntryList();
    clear();
    for(int i=0; i<entries.size(); ++i)
        addItem(entries[i], getDataForEntry(i));
}

由uic生成的ui_dialog.h:

void setupUi(QDialog *Dialog)
{
    //<snip>

    cbxMyComboBox = new Sub_QComboBox(parent);

    //<snip>

    retranslateUi(Dialog);

    QMetaObject::connectSlotsByName(Dialog);
} // setupUi

void retranslateUi(QDialog *Dialog)
{
    //<snip>

    cbxLanguage->clear();
    cbxLanguage->insertItems(0, QStringList()
    //design time contents
    );

    //<snip>

} // retranslateUi

2 个答案:

答案 0 :(得分:1)

您可以将模型与QComboBox一起使用,这样每当您想要更改组合框的内容时,您只需更新模型,其余的组合框将自动更新。

  

它有一些QComboBox,我想在其中放置一些占位符文本   设计时间

QComboBox 没有占位符选项,因此您需要有一个可编辑的组合框并使用它:

myCombo->lineEdit()->setPlaceholderText("Some text");
  

在运行时加载实际内容

动态加载内容,您可以使用模型。

itemModel = new QStringListModel(this);
comboBox1->setModel(itemModel);
comboBox2->setModel(itemModel);

答案 1 :(得分:-2)

我最终使用的解决方案如下。我决定当内置的模型没问题时,没有必要求助于自定义模型。

首先,将内容的数量移出构造函数并转换为专用的公共方法:

void Sub_QComboBox::populateContents(void)
{
    QStringList entries = getEntryList();
    clear();
    for(int i=0; i<entries.size(); ++i)
        addItem(entries[i], getDataForEntry(i));
}

然后,我在对话框构造函数中调用它:

Dialog::Dialog(QWidget *parent) : QDialog(parent)
{
    ui.setupUi(this);
    ui.mySub_QComboBox->populateContents();
}

最后,还可以从对话框的changeEvent中调用它,无论如何都需要实现它来捕捉语言变化:

void Dialog::changeEvent(QEvent *e)
{
    QDialog::changeEvent(e);
    switch (e->type())
    {
        case QEvent::LanguageChange:
            ui.retranslateUi(this); //can't believe we have to do this manually for every QWidget subclass we write...
            ui.mySub_QComboBox->populateContents();
            break;
        default:
            break;
   }
}

完成!因此,我可以在Qt Designer中放置任何我喜欢的内容,因此它看起来很适合截图/演示,但在运行时,内容在构造时设置一次,如果语言更改则再次设置。