Qt - 如何从QObject转换为UI元素?

thn*_*tls 3 c++ qt qt4 qwidget

我在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());
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用它时,它会构建并编译得很好,但是当它运行时会崩溃.我检查过,这两个类都是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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有人有任何想法,我会很感激帮助.谢谢.

更新2:我还没有找到很多在线帮助这个仍然,所以我也可以问,如果有任何方式这样做没有投射,即直接从QWidget的原始类型获取对象,我会真的也欣赏这一点.我对目前的战略或任何事情都没有心痛,这只是我能想到的唯一方式 - 我会采取任何有效的方法.

thu*_*uga 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

但这对我来说似乎仍然是一个糟糕的设计.包含组合框和复选框的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;
};
Run Code Online (Sandbox Code Playgroud)

  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;
}
Run Code Online (Sandbox Code Playgroud)

然后在你的其他课程中,你可以打电话getCheckBoxTextListgetComboTextList喜欢这样:

QStringList comboTextList = myWidget->getComboBoxList();
QStringList checkTextList = myWidget->getCheckBoxTextList();
Run Code Online (Sandbox Code Playgroud)