我在Qt 4.7工作,我的对话框中有一个QWidget对象。我需要遍历每个子节点并将当前文本提取到QStringList中。每个其他对象都是QCheckBox,其余的是QComboBoxes(我只需要两者的文本部分)。到目前为止,我能想到的唯一方法就是使用children()函数将它们作为QObject *并投射它们,如下所示:
QStringList textlist;
for(int i = 0; i < ui->myWidget->children().size(); i++)
{
if(i % 2 == 0)
{
QCheckBox *q = (QCheckBox *)ui->myWidget->children().at(i);
textlist.append(q->text());
}
else
{
QComboBox *q = (QComboBox *)ui->myWidget->children().at(i);
textlist.append(q->currentText());
}
}
但是,当我尝试使用它时,它会构建并编译得很好,但是当它运行时会崩溃。我检查过,这两个类都是QObject的子类(虽然间接通过QAbstractButton和QWidget),这是列表ui-> myWidget-&gt; children()中对象的类型,所以我觉得他们应该能够投射这条路。我之前没有做过很多这方面的工作,所以我不确定是否有更好的方法来做到这一点。如果有人有任何想法,将不胜感激。谢谢!
更新:所以,我无法以这种方式或使用qobject_cast进行转换。然而,我发现我可以从QObject转到QWidget,我想我应该可以使用dynamic_cast从QWidget转到所需的对象,但这也不起作用。现在我有这个:
QStringList textlist;
for(int i = 0; i < ui->myWidget->children().size(); i++)
{
QWidget *qw = qobject_cast<QWidget*>(ui->myWidget->children().at(i)
if(i % 2 == 0)
{
QComboBox *q = dynamic_cast<QComboBox*>(qw);
if(q)
{
textlist.append(q->text());
}
}
else
{
QCheckBox *q = dynamic_cast<QCheckBox*>(qw);
if(q)
{
textlist.append(q->currentText());
}
}
}
如果有人有任何想法,我会很感激帮助。谢谢。
UPDATE2:我还没有找到很多在线帮助这个,所以我也可以问,如果有任何方式这样做没有强制转换,即直接从QWidget以原始类型获取对象,我也非常感谢。我对目前的战略或任何事情都没有心痛,这只是我能想到的唯一方法 - 我会采取任何有效的方法。
答案 0 :(得分:7)
您应该考虑使用qobject_cast
。在演员表之后,您还应该检查对象是否有效。
QStringList textlist;
for(int i = 0; i < ui->myWidget->children().size(); i++)
{
if(i % 2 == 0)
{
QCheckBox *q = qobject_cast<QCheckBox*>(ui->myWidget->children().at(i));
if(q)
textlist.append(q->text());
}
else
{
QComboBox *q = qobject_cast<QComboBox*>(ui->myWidget->children().at(i));
if(q)
textlist.append(q->currentText());
}
}
但这对我来说似乎仍然是一个糟糕的设计。包含组合框和复选框的窗口小部件类应该有一个函数,它通过复选框和组合框并返回QStringList
。然后你可以调用那个函数。
这是一个例子
mywidget.h:
namespace Ui {
class MyWidget;
}
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
~MyWidget();
QStringList getComboTextList();
QStringList getCheckBoxTextList();
private:
Ui::MyWidget *ui;
QList<QComboBox*> comboList;
QList<QCheckBox*> checkList;
};
mywidget.cpp:
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
this->setLayout(new QVBoxLayout);
for(int i = 0; i < 5; i++)
{
QCheckBox *checkBox = new QCheckBox(this);
this->layout()->addWidget(checkBox);
checkBox->setText(QString("Check box #%1").arg(i));
checkList.append(checkBox);
}
for(int i = 0; i < 5; i++)
{
QComboBox *comboBox = new QComboBox(this);
this->layout()->addWidget(comboBox);
comboBox->addItem("Combo box item 1");
comboBox->addItem("Combo box item 2");
comboList.append(comboBox);
}
}
MyWidget::~MyWidget()
{
delete ui;
}
QStringList MyWidget::getComboTextList()
{
QStringList returnList;
for(int i = 0; i < comboList.length(); i++)
{
returnList << comboList[i]->currentText();
}
return returnList;
}
QStringList MyWidget::getCheckBoxTextList()
{
QStringList returnList;
for(int i = 0; i < checkList.length(); i++)
{
returnList << checkList[i]->text();
}
return returnList;
}
然后在您的其他课程中,您可以像这样致电getCheckBoxTextList
或getComboTextList
:
QStringList comboTextList = myWidget->getComboBoxList();
QStringList checkTextList = myWidget->getCheckBoxTextList();