各項目の列に QComboBox がある QTreeWidget があります。QSignalMapper を使用してスロットに接続し、トリガーされたときにコンボボックス内のアイテムとインデックスの両方を正常に取得しています。私はこのようにしました:
foreach(Workplace *wp, allWorkplaces){
QTreeWidgetItem *workplaceItem = new QTreeWidgetItem;
workplaceItem->setText(0, wp->workplaceName());
workplaceItem->setText(1, wp->workplaceDescription());
myWorkplaceUi->treeWidget->addTopLevelItem(workplaceItem);
QComboBox *combo = new QComboBox();
combo->addItems(allShiftModels);
combo->setAutoFillBackground(true);
ShiftModel *shiftModel = qobject_cast<ShiftModel *>(wp->usedShiftModel);
myWorkplaceUi->treeWidget->setItemWidget(workplaceItem,2, combo);
if(shiftModel && !shiftModel->shiftModelName().isEmpty()){
qDebug()<<"after the cast: "<< shiftModel->shiftModelName();
combo->setCurrentIndex(combo->findText(shiftModel->shiftModelName(), Qt::MatchExactly));
}else{
combo->setCurrentIndex(combo->findText("None", Qt::MatchExactly));
}
connect(combo, SIGNAL(currentIndexChanged(int)), signalMapper, SLOT(map()));
signalMapper->setMapping(combo, QString("%1").arg(wp->workplaceName()));
}
connect(signalMapper, SIGNAL(mapped(const QString &)),this, SLOT(changed(const QString &)));
Workplace
私の目的は、と の両方を取得した後、ShiftModel
作成済みの Workplaces のインスタンスでそれらを更新することです。したがって、基本的には、選択された Workplace と ShiftModel を見つけようとします。これは、選択された ShiftModel に応じて、Workplace クラスの ShiftModel へのポインターを変更するためです。
class Workplace : public QObject
{
Q_OBJECT
public:
(...)
ShiftModel *usedShiftModel;
(...)
}
そしてchanged
スロット:
void workplacesdialog::changed(QString position){
QList<Workplace* > allWorkplaces = this->myProject->listMyWorkplaces();
QList<ShiftModel*> allShiftModels = this->myProject->myFactory->listShiftModels();
foreach(Workplace* workplace, allWorkplaces){
foreach(ShiftModel *shiftmodel, allShiftModels){
qDebug() <<"workplace:"<< workplace->workplaceName();
qDebug() <<"shiftmodel:"<< shiftmodel->shiftModelName();
QString wp = position;
QTreeWidgetItem* item=(QTreeWidgetItem*)myWorkplaceUi->treeWidget->findItems(wp,Qt::MatchExactly,0).at(0);
QComboBox *combo = (QComboBox*)myWorkplaceUi->treeWidget->itemWidget(item,2);
if(combo && item){
QString sm = combo->currentText();
qDebug() << "selected shiftmodel "<< sm << " on workplace "<< wp;
if(workplace->workplaceName()==wp && shiftmodel->shiftModelName()==sm){
workplace->usedShiftModel = shiftmodel;
break;
}
else{
workplace->usedShiftModel = 0;
return;
}
}else{
qDebug() << "cast failed!";
return;
}
}
}
}
したがって、これに関する私の問題は、コンボボックスの1つをクリックすると、選択されたアイテムとインデックスの両方を正常に取得できforeach
ますが、スロット内の2つのループでそれらをトラバースしようとすると、期待どおりに機能しません。コンボボックスのいずれかでインデックスをクリックするたびに、これが呼び出されることを望んでいました。ただし、何らかの理由で、ユーザーが選択したものと既に設定されているものを一致させるために使用している方法は機能しません。
また、リストの1番目workplace
とallWorkplaces
リストの1番目の両方にしかヒットしないように見えますが、これは私の問題です。shiftmodel
ShiftModels
誰かがこれを修正する方法を知っているか、共有するアイデアを持っている場合は、私に知らせてください. ありがとうございました。