我有一个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
答案 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中放置任何我喜欢的内容,因此它看起来很适合截图/演示,但在运行时,内容在构造时设置一次,如果语言更改则再次设置。