Я работаю в проекте и пытаюсь установить макет в виджете. В макете я добавляю виджет, в который я обертываю весь 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);
}
}