场景:我的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 ...
您可以使用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();
}