c – Qt – 如何从QObject转换为UI元素?
我在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-> 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()); } } } 如果有人有任何想法,我会很感激帮助.谢谢. 更新2:我还没有找到很多在线帮助这个仍然,所以我也可以问,如果有任何方式这样做没有投射,即直接从QWidget的原始类型获取对象,我会真的也欣赏这一点.我对目前的战略或任何事情都没有心痛,这只是我能想到的唯一方式 – 我会采取任何有效的方法. 解决方法
您应该考虑使用
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()); } } 但这对我来说似乎仍然是一个糟糕的设计.包含组合框和复选框的widget类应该有一个函数,它通过复选框和组合框并返回一个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(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 一个简单实例理解cocos2d-x触摸事件中的坐标系
- ruby-on-rails – 没有这样的文件或目录(public / assets /
- rails用generate为两个模型创建has_and_belongs_to_many中间
- xml – XSLT – 使用XPath计运算符元素的数量
- 最全面的常用正则表达式大全
- xml – 为“周期表”和所有链接搜索维基页面
- ruby-on-rails – has_many:通过counter_cache
- PostgreSQL的小技巧
- 正则化方法:L1和L2 regularization、数据集扩增、dropout
- Oracle Dataguard中备库中归档日志不同步