C++ Qt-QSignalMapper调用的函数中的更新
我有一个QTreeWidget,其中每个项目在一列中都有一个QComboBox。我已经用QSignalMapper将它连接到一个插槽,当它被触发时,我正在成功地检索组合框中的项和索引。我是这样做的:C++ Qt-QSignalMapper调用的函数中的更新,c++,qt,pointers,signals-slots,qcombobox,C++,Qt,Pointers,Signals Slots,Qcombobox,我有一个QTreeWidget,其中每个项目在一列中都有一个QComboBox。我已经用QSignalMapper将它连接到一个插槽,当它被触发时,我正在成功地检索组合框中的项和索引。我是这样做的: foreach(Workplace *wp, allWorkplaces){ QTreeWidgetItem *workplaceItem = new QTreeWidgetItem; workplaceItem->setText(0, wp->work
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 &)));
和更改的插槽:
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;
}
}
}
}
void workplacedialog::已更改(QString位置){
QList allWorkplaces=this->myProject->listMyWorkplaces();
QList allShiftModels=this->myProject->myFactory->listShiftModels();
foreach(工作场所*工作场所,所有工作场所){
foreach(ShiftModel*ShiftModel,所有ShiftModel){
qDebug()项目小部件(项目2);
如果(组合和项目){
QString sm=combo->currentText();
qDebug()usedShiftModel=0;
返回;
}
}否则{
qDebug()问题在于:
if(workplace->workplaceName()==wp && shiftmodel->shiftModelName()==sm){
workplace->usedShiftModel = shiftmodel;
break;
}
else{
workplace->usedShiftModel = 0;
return;
}
如果工作场所名称不匹配,或者轮班模型名称不匹配,则将删除工作场所与其当前链接的轮班模型之间的关系,并返回函数
我可以为您重新构造两个for循环,但有一种更简单、更不容易出错的方法:
注意:我用“TODO”标记了一些代码路径,由于时间不够,我跳过了这些代码路径。不过,您应该能够自己找到它们
//为快速查找设置哈希
QHashworkplaceHash;
QList allWorkplaces=this->myProject->listMyWorkplaces();
foreach(工作场所*工作场所,所有工作场所)
{
insert(workplace,workplace->workplaceName());
}
//TODO:在这里对换档模式执行类似操作
//查找所选的工作场所
如果(!workplaceHash.contains(位置))
{
//TODO:错误处理(未知/未选择工作区)
返回;
}
//否则:已选择有效的工作区
Workplace*selectedWorkplace=workplaceHash.value(位置);
//TODO:检索换档模型的名称(存储在变量sm中)
//查找所选的换档模式
如果(!shiftplaceHash.contains(sm))
{
//未选择任何换档模式
selectedWorkplace->usedShiftModel=0;
返回;
}
//其他:选择了工作地点和轮班模式
Shiftplace*selectedShiftModel=shiftplaceHash.value(sm);
selectedWorkplace->usedShiftModel=selectedShiftModel;
重构的一些想法:
- 您可以在该方法之外创建哈希并将其存储在成员变量中。只要确保在添加或删除工作区时哈希始终更新即可
- 通过将部分代码提取到单独的方法中,例如
QString getSelectedShiftModelName()
等,可以更容易地发现错误
所以,最后我发现我的循环真的是一团糟了……现在可以工作了:
void workplacesdialog::changed(QString position){
QList<Workplace* > allWorkplaces = this->myProject->listMyWorkplaces();
QList<ShiftModel*> allShiftModels = this->myProject->myFactory->listShiftModels();
qDebug() << allWorkplaces.size() << " workplaces";
qDebug() << allShiftModels.size() << " ShiftModels";
QString wp = position;
QString sm;
QTreeWidgetItem* item=(QTreeWidgetItem*)myWorkplaceUi->treeWidget->findItems(wp,Qt::MatchExactly,0).at(0);
QComboBox *combo = (QComboBox*)myWorkplaceUi->treeWidget->itemWidget(item,2);
if(combo && item){
sm = combo->currentText();
qDebug() << "selected shiftmodel "<< sm << " on workplace "<< wp;
}else{
qDebug() << "cast failed!";
return;
}
foreach(Workplace* workplace, allWorkplaces){
foreach(ShiftModel *shiftmodel, allShiftModels){
qDebug() <<"workplace:"<< workplace->workplaceName();
qDebug() <<"shiftmodel:"<< shiftmodel->shiftModelName();
if(workplace->workplaceName()==wp && shiftmodel->shiftModelName()==sm){
qDebug() << "found match!: "<< wp << " >>>>> " << sm;
workplace->usedShiftModel = shiftmodel;
return;
}else if(workplace->workplaceName()==wp && sm=="None"){
qDebug() << "clear match: "<< wp << " >>>>> " << sm;
workplace->usedShiftModel = 0;
return;
}
}
}
}
void workplacedialog::已更改(QString位置){
QList allWorkplaces=this->myProject->listMyWorkplaces();
QList allShiftModels=this->myProject->myFactory->listShiftModels();
qDebug()项目小部件(项目2);
如果(组合和项目){
sm=组合->当前文本();
qDebug()这听起来真的很聪明,也许在未来的某个时候我会回到它,但现在对于快速原型设计,我有了另一个解决方案…好的提示,不过!+1'd!
// 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;
void workplacesdialog::changed(QString position){
QList<Workplace* > allWorkplaces = this->myProject->listMyWorkplaces();
QList<ShiftModel*> allShiftModels = this->myProject->myFactory->listShiftModels();
qDebug() << allWorkplaces.size() << " workplaces";
qDebug() << allShiftModels.size() << " ShiftModels";
QString wp = position;
QString sm;
QTreeWidgetItem* item=(QTreeWidgetItem*)myWorkplaceUi->treeWidget->findItems(wp,Qt::MatchExactly,0).at(0);
QComboBox *combo = (QComboBox*)myWorkplaceUi->treeWidget->itemWidget(item,2);
if(combo && item){
sm = combo->currentText();
qDebug() << "selected shiftmodel "<< sm << " on workplace "<< wp;
}else{
qDebug() << "cast failed!";
return;
}
foreach(Workplace* workplace, allWorkplaces){
foreach(ShiftModel *shiftmodel, allShiftModels){
qDebug() <<"workplace:"<< workplace->workplaceName();
qDebug() <<"shiftmodel:"<< shiftmodel->shiftModelName();
if(workplace->workplaceName()==wp && shiftmodel->shiftModelName()==sm){
qDebug() << "found match!: "<< wp << " >>>>> " << sm;
workplace->usedShiftModel = shiftmodel;
return;
}else if(workplace->workplaceName()==wp && sm=="None"){
qDebug() << "clear match: "<< wp << " >>>>> " << sm;
workplace->usedShiftModel = 0;
return;
}
}
}
}