gpt4 book ai didi

c++ - Qt - 在 QSignalMapper 调用的函数中更新

转载 作者:行者123 更新时间:2023-11-30 04:15:03 25 4
gpt4 key购买 nike

我有一个 QTreeWidget,其中它的每个项目在一列中都有一个 QComboBox。我已将它连接到带有 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 &)));

我的目标是,在检索到 WorkplaceShiftModel 之后,在我已经创建的 Workplaces 的实例中更新它们。所以,基本上,我尝试找到所选的 Workplace 和 ShiftModel,因为根据所选的 ShiftModel,我将更改指向 Workplace 类中的 ShiftModel 的指针:

class Workplace : public QObject
{
Q_OBJECT

public:
(...)
ShiftModel *usedShiftModel;
(...)
}

改变了槽:

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;
}
}
}
}

所以,我的问题是,当我单击其中一个组合框时,成功检索了所选的项目和索引,但是随后,当我尝试使用中的两个 foreach 循环遍历它们时插槽,它没有像我预期的那样工作。我希望每次我单击其中一个组合框中的索引时,都会调用它,而且确实如此。尽管出于某种原因,我用来将用户选择的内容与已实例化的内容相匹配的方法不起作用。

另外,看起来它只命中 allWorkplaces 列表中的第一个 workplace 以及 中的第一个 shiftmodel >ShiftModels 列表,这是我的问题。

如果有人知道如何解决这个问题或有任何想法要分享,请告诉我。谢谢。

最佳答案

问题是这样的:

if(workplace->workplaceName()==wp && shiftmodel->shiftModelName()==sm){
workplace->usedShiftModel = shiftmodel;
break;
}
else{
workplace->usedShiftModel = 0;
return;
}

如果工作场所名称不匹配,或者类次模型名称不匹配,工作地点与其当前链接的类次模型之间的关系将被删除,您的函数将返回。

我可以为您重构这两个 for 循环,但还有一种更简单且不易出错的方法:

注意:我用“TODO”标记了一些代码路径,由于时间不够,我跳过了这些路径。不过,您应该能够自己弄清楚它们。

// Set up hashes for quick lookup
QHash< QString, Workplace* > workplaceHash;

QList<Workplace* > allWorkplaces = this->myProject->listMyWorkplaces();
foreach( Workplace* workplace, allWorkplaces )
{
workplaceHash.insert( workplace, workplace->workplaceName() );
}

// TODO: Do a similar thing for the shift models here

// Find the selected workplace
if( !workplaceHash.contains( position ) )
{
// TODO: Error handling (An unknown/No workplace was selected)
return;
}
// else: A valid workplace was selected

Workplace* selectedWorkplace = workplaceHash.value( position );

// TODO: Retrieve the name of the shift model (stored in variable sm)

// Find the selected shiftmodel
if( !shiftplaceHash.contains( sm ) )
{
// No shift model was selected
selectedWorkplace->usedShiftModel= 0;
return;
}
// Else: Both work place and shift model were selected

Shiftplace* selectedShiftModel = shiftplaceHash.value( sm );

selectedWorkplace->usedShiftModel = selectedShiftModel;

一些重构的想法:

  • 您可以在此方法之外创建散列并将它们存储在成员变量中。只需确保在添加或删除工作场所时始终更新哈希。
  • 您可以通过将部分代码提取到单独的方法中来更容易地发现错误,例如QString getSelectedShiftModelName()

关于c++ - Qt - 在 QSignalMapper 调用的函数中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18573887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com