如何获得QTreeWidgetItem中QComboBox索引更改的通知?

问题描述 投票:1回答:1

场景:我的MainWindow中有2列QTreeWidget。我使用以下代码在第一列中添加一行文本,在第二列中添加QComboBox:

QTreeWidgetItem *rowItem = new QTreeWidgetItem(mainTree);
QComboBox *comboBox = GenerateComboBox(mainTree);
comboBox->setCurrentIndex(someIndexValue);
rowItem->setText(0,someText);
mainTree->setItemWidget(rowItem,1,comboBox);

我的目的是拥有一个插槽,当组合框的索引更改时,该插槽可以执行一些工作。我需要知道更改后的comboBox所在的TreeItem的行号,以及该值已更改为comboBox的索引。]


目前的了解:

以我对QT的有限了解:1.似乎TreeItem和comboBox并不相互了解,因为TreeWidget用作两者的父级。 2.我看不到使用现有的将变更通知向上传播的方式将comboBox的indexChanged信号连接到TreeItem itemChanged插槽的方法。

问题:

有没有一种方法可以实现,而无需编写包装类来实现带有所需参数的插槽和信号,或者将该实现添加到QTreeItem / QComboBox类中?

场景:我的MainWindow中有2列QTreeWidget。我使用以下代码在第一列中添加了一行文本,在第二列中添加了QComboBox:QTreeWidgetItem * rowItem = new ...

c++ qt
1个回答
0
投票

您可以使用lambda函数:

#include <QtWidgets>

int main(int argc, char *argv[]) {
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc, argv);


    QTreeWidget * mainTree = new QTreeWidget;
    mainTree->setColumnCount(2);
    for (int i = 0; i < 10; ++i){
        QTreeWidgetItem *rowItem = new QTreeWidgetItem(mainTree);
        rowItem->setText(0, QString("item %1").arg(i));
        QComboBox * comboBox = new QComboBox();
        comboBox->addItems({"option1", "option2", "option3", "option4"});
        mainTree->setItemWidget(rowItem, 1, comboBox);

        QObject::connect(comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), comboBox,
            [comboBox, rowItem](int index){
            qDebug() << index << comboBox << rowItem->text(0);
        });
    }

    QMainWindow w;
    w.setCentralWidget(mainTree);   
    w.resize(640, 480);
    w.show();

    return app.exec();
}
© www.soinside.com 2019 - 2024. All rights reserved.