Qt - How to convert from QObject to UI elements?

前端 未结 1 1812
孤街浪徒
孤街浪徒 2021-01-18 17:49

I am working in Qt 4.7, and I have a QWidget object in my dialog. I need to go through each of the children and extract the current text into a QStringList. Every other obje

相关标签:
1条回答
  • 2021-01-18 18:23

    You should think about using qobject_cast. After the cast you should also check if the object is valid.

    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());
        }
    }
    

    But this still seems like a bad design to me. The widget class that contains the comboboxes and checkboxes should have a function, that goes through the checkboxes and comboboxes and returns a QStringList. Then you could just call that function.

    Here is an example

    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;
    }
    

    Then in your other class you can just call getCheckBoxTextList or getComboTextList like this:

    QStringList comboTextList = myWidget->getComboBoxList();
    QStringList checkTextList = myWidget->getCheckBoxTextList();
    
    0 讨论(0)
提交回复
热议问题