如何在运行时指定 QComboBox 项目?

希思·拉夫提

我有一个在 Qt Designer 中以图形方式设计的 QDialog。它有一些 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
希思·拉夫提

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

首先,将内容填充从构造函数中移出并放入专用的公共方法中:

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 中,这样它对于截图/演示来说看起来很不错,但是在运行时,内容在构造时设置一次,如果语言发生变化,则再次设置。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使QCombobox可扩展用于分层项目?

如何更改QComboBox项目的高度大小?

如何刷新Qcombobox [python]中的项目?

如何从多选QComboBox获取已检查项目?

如何通过选择项目从QCombobox项目中获取内容?

如何在QComboBox中标记当前项目文本?

向QComboBox添加项目

如何在QcomboBox中显示项目取决于第二个QcomboBox所选项目

如何在运行时更新Fmx.TPopupCell项目

如何在运行时删除 TFlowLayout 的所有项目?

如何在运行时访问另一个项目中的类

如何在运行时使用C#将项目添加到ComboBox

如何在运行时更改列表框中的选定项目文本?

如何在运行时更改JComboBox中的项目数组

如何在运行时确定python 3 Appengine标准中的Google项目名称

FireMonkey TListView:如何在运行时为项目着色?

如何在运行时读取给定项目中的MSBuild属性?

如何在运行时 KendoUI 中禁用 Kendo ToolBar 中的项目?

如何在运行时从项目中包含的XAML文件获取文本?

如何在运行时的FastReport中将项目放在最前面?

如何在 create-react-app 项目中在运行时覆盖默认的 .eslint 规则

在非Maven项目中,如何在运行时查看java类路径上的类?

如何在运行时将项目添加到TStackPanel

如何在运行时将项目添加到 wpf 中的 Combobox

如何使用其唯一的ID向Qcombobox添加项目

如何使用QSqlQueryModel将项目动态添加到QComboBox

macOS项目在运行时失败

如何从 QComboBox 中获取所选项目以显示在 PyQt5 的 QTableWidget 中?(QComboBox 有复选框来选择项目)

在运行时执行过程中如何获取Intellij的根项目目录