2013-08-20 15 views
0

我有一個組合框與多個複選框項目,我需要能夠遍歷他們,並確定他們是否檢查或甚至更恰當,只要一個項目被選中,有一個事件開火,但我不能讓信號/插槽組合正常工作。Qt5 C++如何訪問模型中的項目以檢查狀態?

下面是我的一些代碼:

void MainWindow::setupQueryBuilder(Ui::MainWindow* ui) 
{ 
    QStandardItemModel* assessmentModel = new QStandardItemModel(3, 1); 
    QStandardItem* assessmentPleaseSelect = new QStandardItem(); 
    QStandardItem* assessmentVisionScreening = new QStandardItem(); 
    QStandardItem* assessmentHearingAssessment = new QStandardItem(); 
    QStandardItem* assessmentDevelopmentalAssessment = new QStandardItem(); 

    assessmentPleaseSelect->setText("Please Select..."); 
    assessmentPleaseSelect->setFlags(Qt::ItemIsEnabled); 
    assessmentPleaseSelect->setData(Qt::CheckStateRole); 

    assessmentVisionScreening->setText("Vision Screening"); 
    assessmentVisionScreening->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); 
    assessmentVisionScreening->setData(Qt::Unchecked, Qt::CheckStateRole); 

    assessmentHearingAssessment->setText("Hearing Assessment"); 
    assessmentHearingAssessment->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); 
    assessmentHearingAssessment->setData(Qt::Unchecked, Qt::CheckStateRole); 

    assessmentDevelopmentalAssessment->setText("Developmental Assessment"); 
    assessmentDevelopmentalAssessment->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); 
    assessmentDevelopmentalAssessment->setData(Qt::Unchecked, Qt::CheckStateRole); 

    assessmentModel->insertRow(0, assessmentPleaseSelect); 
    assessmentModel->insertRow(1, assessmentVisionScreening); 
    assessmentModel->insertRow(2, assessmentHearingAssessment); 
    assessmentModel->insertRow(3, assessmentDevelopmentalAssessment); 

    ui->SearchAssessmentSelect->setModel(assessmentModel); 
} 
+0

你試過連接到這個信號:無效化QAbstractItemModel :: dataChanged(常量QModelIndex及左上,常量QModelIndex&bottomRight,常量QVector 和角色= QVector ())? – TheDarkKnight

+0

你嘗試連接什麼信號,並嘗試連接到哪個插槽? – thuga

+0

我試圖遵循這個,但我無法得到它的工作: 「它甚至比那更容易:)沒有任何子類必要:連接(this->型號,信號(dataChanged(常量QModelIndex&,常量QModelIndex&) ),this,SLOT(slot_changed())); with:void MainWindow :: slot_changed(){std :: cout <<「highlight。」<< std :: endl; if(this-> Item-> checkState() == Qt :: Unchecked){std :: cout <<「Unchecked!」<< std :: endl;} else if(this-> Item-> checkState()== Qt :: Checked){std :: cout <<「Checked!」<< std :: endl;}} - David Doria 11年12月8日在12:34「 – T3CHN0CR4T

回答

1

我沒試過,但看的文檔你有一個QStandardItemModelsignalitemChanged(QStandardItem *item)。你想要做的是創建一個slot,其名稱(例如)modelItemChanged(QStandardItem *item)connect他們與connect(assessmentModel, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(modelItemChanged(QStandardItem *)))

只要QStandardItem發生變化,應該設置您的模型觸發slot,並且它會傳遞指向已更改項目的指針。在你modelItemChanged(QStandardItem *item)功能你就可以查詢QStandardItem *item看到它處於什麼狀態

+0

謝謝,我明天會看看,看看我能否得到它的工作。聽起來雖然,歡呼:) – T3CHN0CR4T

+0

工作就像一個魅力,感謝堆隊友:D – T3CHN0CR4T