我有一个在 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] 删除。
我来说两句