수량:QStandardItemModel을 사용하여 QTableView에 사용자 정의 편집기(콤보 상자)를 갖도록 QItemDelegate를 만듭니다.

StackOverflow https://stackoverflow.com//questions/9672158

문제

특정 열의 각 행에 콤보 상자를 표시하는 테이블을 Qt에 구현해야 합니다.

지금까지 이 예제를 기반으로 합니다.http://doc.qt.nokia.com/4.7-snapshot/itemviews-spinboxdelegate.html그리고 이 질문에 대해:QStandardItem + QComboBoxQItemDelegate를 성공적으로 만들었습니다.

내 문제는 main.cpp의 main() 함수에서 구현하면 모든 것이 잘 작동하지만 Qt Designer에 테이블을 삽입하여 mainwindow.cpp의 MainWindow 클래스 함수 내에서 사용하면 제대로 작동하지 않는다는 것입니다. .

나에게 단서를 주실 수 있나요?미리 감사드립니다!

main.cpp에 대한 위임(잘 작동합니다. 두 번째 열을 두 번 클릭하면 콤보 상자가 표시됩니다):

QStandardItemModel model(4, 2);
QTableView tableView;
tableView.setModel(&model);
ComboBoxDelegate delegate;
tableView.setItemDelegateForColumn(1,&delegate);
tableView.horizontalHeader()->setStretchLastSection(true);

for (int row = 0 ; row < 4; ++row) {
    for (int col = 0; col < 2; ++col) {
        QModelIndex index = model.index(row, col, QModelIndex());
        model.setData(index, QVariant((row+1) * (col+1)));
    }
}
tableView.show();

mainwindow.cpp 대안 1에 대한 위임(빈 테이블이 표시됨)

QStandardItemModel model(4,2);
ui->tablePoint->setModel(&model);
ComboBoxDelegate delegate;
ui->tablePoint->setItemDelegateForColumn(1,&delegate);
ui->tablePoint->horizontalHeader()->setStretchLastSection(true);

for (int row = 0 ; row < 4; ++row) {
    for (int col = 0; col < 2; ++col) {
        QModelIndex index = model.index(row, col, QModelIndex());
        model.setData(index, QVariant((row+1) * (col+1)));
    }
}

mainwindow.cpp 대안 2에 대한 위임(테이블이 표시되지만 두 번째 열을 두 번 클릭하면 콤보 상자가 표시되지 않습니다.대신 일반 Spin Box가 표시됩니다.)

QStandardItemModel* model = new QStandardItemModel(4,2);
ui->tablePoint->setModel(model);
ComboBoxDelegate delegate;
ui->tablePoint->setItemDelegateForColumn(1,&delegate);
ui->tablePoint->horizontalHeader()->setStretchLastSection(true);

for (int row = 0 ; row < 4; ++row) {
    for (int col = 0; col < 2; ++col) {
        QModelIndex index = model->index(row, col, QModelIndex());
        model->setData(index, QVariant((row+1) * (col+1)));
    }
}
도움이 되었습니까?

해결책

mainwindow.cpp의 두 경우 모두 표시되는 코드가 생성자에 있다고 가정하면 "Java, Python, Perl 또는 메모리 관리에 관심이 없는 모든 언어에서 발생" 오류를 수행하여 모델을 할당합니다. 및/또는 힙이 아닌 스택에 위임합니다.

C++에서는 스택에 할당된 항목(예: QStandardItemModel model(4,2);)는 함수에서 반환될 때 소멸되는 반면, 힙에 할당된 항목(예: QStandardItemModel* model = new QStandardItemModel(4,2); 너까지 살아 delete 그것).사례 1은 스택에 물건이 할당되었기 때문에 작동합니다. main() 앱이 지속되는 동안 살아있습니다.

요점:사례 3의 경우 다음을 수행하십시오. ComboBoxDelegate* delegate = new ComboBoxDelegate(); 그리고 ui->tablePoint->setItemDelegateForColumn(1,delegate);

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top