Как заменить виджет (включая QTableWidget, который содержит comboBox) другим виджетом (включая QTableWidget, который содержит только текст)? - PullRequest
0 голосов
/ 17 февраля 2020

Я работаю в проекте и пытаюсь установить макет в виджете. В макете я добавляю виджет, в который я обертываю весь QTableWidget в соответствии с ожиданием от виджета.

Для каждого случая я создаю новый виджет и заменяю предыдущий виджет текущим виджетом. Из двух случаев, в одном случае, в QTableWidget я добавил комбобокс, а в другом QTableWidget я добавил только текст. Когда я пытаюсь заменить виджет с текстом на виджет с помощью комбобокса, он работает как положено, но когда я пытаюсь Замените виджет с помощью комбинированного списка на виджет с текстом, тогда он выдаст ошибку. Чтобы это исправить, я попытался удалить строки из существующего QTableWidget перед заменой виджета, и теперь я не получаю сообщение об ошибке, но я не понимаю этого, так как заменяю виджет, тогда почему это должно иметь значение, если в существующем QTableWidget есть строки или нет.

Вот фрагмент кода для вашей справки,

construct()
{
    do
    {
        clear();

        QStandardItemModel* pModel = m_pModel->getModel();

        switch (num)
        {

        case 1:
        {

            auto pWidget2 = new QWidget();

            m_pStateNameWidget->insertRow(0);

            QTableWidgetItem* pItem1 = new QTableWidgetItem(L"1");
            m_pStateNameWidget->setItem(0, 0, pItem1);

            QTableWidgetItem* pItem2 = new QTableWidgetItem(L"2");
            m_pStateNameWidget->setItem(0, 1, pItem2);

            QStandardItem* pParent = pModel->item(0);
            if (!pParent)
                break;

            int nRow = pParent->rowCount();

            for(int i = 0; i < nRow; i++)
            {
                QStandardItem* pItemName = pParent->child(i, 0);
                QStandardItem* pItemType = pParent->child(i, 1);

                std::wstring strName = pItemName->text().toStdWString();
                std::wstring strType = pItemType->text().toStdWString();

                QTableWidgetItem* pTableName = new QTableWidgetItem();

                pTableName->setText(pItemName->text());

                QTableWidgetItem* pTableType = new QTableWidgetItem();

                pTableType->setText(pItemType->text());


                m_pStateWidget->insertRow(i);
                m_pStateWidget->setItem(i, 0, pTableName);
                m_pStateWidget->setItem(i, 1, pTableType);
            }

            m_pVBoxLayout2->addWidget(m_pStateNameWidget);
            m_pVBoxLayout3->addWidget(m_pStateWidget);

            m_pGroupBox1->setLayout(m_pVBoxLayout2);
            m_pGroupBox2->setLayout(m_pVBoxLayout3);

            m_pVBoxLayout1->addWidget(m_pGroupBox1);
            m_pVBoxLayout1->addWidget(m_pGroupBox2);

            m_pVBoxLayout1->setMargin(0);

            pWidget2->setLayout(m_pVBoxLayout1);

            m_pVBoxLayout->replaceWidget(m_pCurrWidget, pWidget2);

            m_pCurrWidget->setParent(nullptr);

            m_pCurrWidget = pWidget2;

        }
        break;
        case 2:
        {

            auto pWidget2 = new QWidget();

            QTableWidgetItem* pFromItem = new QTableWidgetItem();
            QComboBox* pComboFrom = new QComboBox;

            std::map<std::wstring, State*> vctState = m_pModel->getStates();

            for (auto& iter : vctState)
                pComboFrom->addItem(QString::fromWCharArray(iter.first.c_str()));


            pComboFrom->setCurrentText(pModel->data(pModel->index(0, 1)).toString());

            pFromItem->setText("From");
            m_pTransWidget->insertRow(0);
            m_pTransWidget->setItem(0, 0, pFromItem);
            m_pTransWidget->setCellWidget(0, 1, pComboFrom);

            layout = new QVBoxLayout;

            layout->addWidget(m_pTransWidget);

            layout->setMargin(0);

            pWidget2->setLayout(layout);

            m_pVBoxLayout->replaceWidget(m_pCurrWidget, pWidget2);


            m_pCurrWidget->setParent(nullptr);
            m_pCurrWidget = pWidget2;


        }
        break;

        }
    } while (false);
}


clear()
{

    int size = m_pStateWidget->rowCount();

    while (size--)
    {
        m_pStateWidget->removeRow(0);
    }

    size = m_pStateNameWidget->rowCount();

    while (size--)
    {
        m_pStateNameWidget->removeRow(0);
    }

    size = m_pTransWidget->rowCount();

    while (size--)
    {
        m_pTransWidget->removeRow(0);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...