【问题标题】:Inserting a child Item into a row of QTreeWidgetItems将子项插入一行 QTreeWidgetItem
【发布时间】:2018-08-02 14:32:42
【问题描述】:

我已经设置了我的 QTreeWidget,使得每个单元格都充满了组合框,但是我想在选定的组合框旁边创建一个文本编辑小部件(或覆盖现有的组合框),具体取决于用户选择的组合框项目。

我想我可以通过在初始设置时将组合框父级添加为属性来做到这一点,然后在与组合框交互时只需使用 setItemWidget 在选定组合框之后的列中放置一个文本编辑项(使用同一个子项)。但似乎没有正确传递父级,或者其他一些问题导致文本编辑小部件出现在它应该在的下面的行中。

我附上了一张照片和一些代码以供澄清。

这是我为 QTreeWidget 设置组合框的地方(特别是 rowType == 0)

void customMethodConstructorWindow::addChildRow(QTreeWidget *widgetParent,QTreeWidgetItem *itemParent,int rowType)
{
//widgetParent->setColumnCount(methodBlocks.at(rowType).size());
if(rowType == 0)
{
    QTreeWidgetItem *childItem = new QTreeWidgetItem(itemParent);

    QVariant itemParentVariant;
    itemParentVariant.setValue(itemParent);
    for(uint cycleSetup = 0;cycleSetup < methodBlocks.at(rowType).size();cycleSetup++)
    {

        QComboBox *itemComboBox = new QComboBox;
        itemComboBox->setProperty("rowType", rowType);
        itemComboBox->setProperty("row", 0);
        itemComboBox->setProperty("column",cycleSetup);
        itemComboBox->setProperty("itemParent",itemParentVariant);
        itemComboBox->addItems(methodBlocks.at(0).at(cycleSetup));
        QObject::connect(itemComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(OnComboIndexChanged(const QString&)));
        widgetParent->setItemWidget(childItem,cycleSetup,itemComboBox);
        itemParent->addChild(childItem);
    }

}
else
{
    QTreeWidgetItem *childItem = new QTreeWidgetItem(itemParent);

    QComboBox *item0ComboBox = new QComboBox;
    item0ComboBox->setProperty("rowType", rowType);
    item0ComboBox->setProperty("row", 1);
    item0ComboBox->setProperty("column", 0);
    item0ComboBox->addItems(methodBlocks.at(1).at(0));
    QObject::connect(item0ComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(OnComboIndexChanged(const QString&)));
    widgetParent->setItemWidget(childItem,0,item0ComboBox);
    itemParent->addChild(childItem);

    QComboBox *item1ComboBox = new QComboBox;
    item1ComboBox->setProperty("rowType", rowType);
    item1ComboBox->setProperty("row", 1);
    item1ComboBox->setProperty("column", 1);
    item1ComboBox->addItems(methodBlocks.at(1).at(rowType));
    QObject::connect(item1ComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(OnComboIndexChanged(const QString&)));
    widgetParent->setItemWidget(childItem,1,item1ComboBox);
    itemParent->addChild(childItem);
}
}

这是我尝试在其中一个组合框上创建文本编辑小部件的地方

void customMethodConstructorWindow::OnComboIndexChanged(const QString& text)
{
QComboBox* combo = qobject_cast<QComboBox*>(sender());
if (combo)
{

    int nRow = combo->property("row").toInt();
    int nCol = combo->property("column").toInt();
    switch (nRow) {
    case 0:
    {
        switch (nCol)
        {
        case 0:
        {
            //combo->setVisible(false);
            //testPoint = combo->pos();


        }
            break;
        case 1:
        {
            if(combo->currentIndex() != 0)
            {
                QTreeWidgetItem *childItem = new QTreeWidgetItem(combo->property("itemParent").value<QTreeWidgetItem*>());
                QTextEdit *textItemEdit = new QTextEdit;
                //QObject::connect(item1ComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(OnComboIndexChanged(const QString&)));
                ui->methodSetupTreeWidget->setItemWidget(childItem,2,textItemEdit);
            }

        }
            break;
        case 2:
                //customObjectAttributes.comparisonType.push_back(combo->currentIndex());
            break;
        case 3:
        {
                //customObjectAttributes.valueB.push_back(combo->currentIndex());
        }
            break;
        case 4:

            break;
        case 5:
            break;
        case 6:
            break;
        case 7:
            //ui->logicSetupTableWidget->setRowCount(ui->logicSetupTableWidget->rowCount()+1);
            if(combo->currentIndex() != 3)
            {
                //addComboRow(ui->logicSetupTableWidget->rowCount()-1);
            }
              //customObjectAttributes.outputType.push_back(combo->currentIndex());
            break;
        }
    }
        break;
    case 1:
    {
        switch (combo->property("column").toInt())
        {
        case 0:

            break;
        case 1:
        {
                addChildRow(ui->methodSetupTreeWidget,ui->methodSetupTreeWidget->itemAt(QPoint(2,1)),0);
                addChildRow(ui->methodSetupTreeWidget,ui->methodSetupTreeWidget->itemAt(QPoint(3,1)),1);

        }
            break;
        case 2:
        {

        }
            break;
        case 3:
        {

        }
            break;
        case 4:
            break;
        case 5:
            break;
        case 6:
            break;
        case 7:
        {

            if(combo->currentIndex() != 3)
            {
                //addComboRow(ui->logicSetupTableWidget->rowCount()-1);
            }

        }
            break;
        }
    }
        break;
    }


}

}

当前情况截图

我的问题是文本编辑显示在小于 (

【问题讨论】:

  • 你不能通过使组合框可编辑来解决这个问题吗?或者,如果不希望派生一个 QWidget 类,该类通过 stackwidget 左右的方式处理从组合框到 lineedit 的所需转换 - 而不会弄乱 treewidgetItems。
  • 我曾考虑让组合框可编辑,但我并不喜欢这种处理方式。在仔细查看 QStackedWidget 文档之后,似乎有一个可行的解决方案。我会看看情况如何,之后再更新。
  • 所以一个让我无法实现 QStackedWidget 工作的问题是我无法将一个小部件(它包含一个 QCombobox 的布局)转换为一个 QCombobox

标签: c++ qt qcombobox qtextedit qtreewidget


【解决方案1】:

我能够使用 QStandardItem:setData() 和 QStackedWidget 找到解决方案来获得我想要的功能。

这是在尝试解决相关问题here.的过程中完成的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2023-03-08
    • 2017-06-18
    相关资源
    最近更新 更多