2015-01-07 4 views
1

내 응용 프로그램에서 "파일 열기"메뉴를 클릭하고 파일을 선택하면 선택된 항목 (3D 오브젝트 파일)이 listwidget에 추가됩니다. 목록에서 항목을 두 번 클릭하면 해당 항목이 화면에 listwidget 옆에 표시됩니다. 그러나 사용자 인터페이스를 단순화하기 위해 두 번 클릭하지 않고 항목을 목록에 추가하고 동시에 화면에 표시하려고합니다. 간단히 말해서, 나는 두 개의 함수, void MainWindow::on_actionOpen_Model_triggered()MainWindow::on_listWidget_itemDoubleClicked(QListWidgetItem *item)을 하나로 결합하고 싶습니다. 하나의 두 기능 결합

void MainWindow::on_actionOpen_File_triggered() 
{ 
QFileDialog diag(this); 
diag.setNameFilter(tr("STL files(*.stl)")); 
diag.setFileMode(QFileDialog::ExistingFiles); 
diag.setViewMode(QFileDialog::Detail); 
QStringList fileNames; 

fileNames = diag.getOpenFileNames(this, "Open Model Files", "", "STL Files (*.stl)"); 
//qDebug()<<QFileInfo(fileNames).absoluteDir(); 
qDebug()<<fileNames; 
ui->listWidget->addItems(fileNames);} 

는이 같은 파일 열기 함수의 끝에서 itemDoubleClicked 기능을 추가했습니다.

this->on_listWidget_itemDoubleClicked(ui->listWidget->currentItem()); 

그러나 파일을 열 때마다 응용 프로그램이 중지됩니다. 선택된 파일이 아직 listwidget에 추가되지 않았기 때문에 같은 기능의 두 번 클릭 된 함수가로드하려고했기 때문입니다. 더블 클릭 함수는 인수로 QListWidgetItem *item을 취합니다. 그 두 가지를 결합하는 것은 쉬운 일이 아닙니다. 누구나 아이디어가 있습니까? 고맙겠습니다.

답변

1

선택한 파일이 listwidget에 아직 추가되지 않았으며 동일한 기능에서 두 번 클릭 한 함수가로드하려고했기 때문입니다.

아니요, QListWidget::currentItem()은 포커스가있는 목록 위젯에서 항목을 검색하기 때문입니다. 목록 위젯에 항목을 추가하는 것만으로도 항목 포커스가 제공되지 않으므로 QListWidget::currentItem()은 null 포인터를 반환합니다.

이 문제를 해결할 수있는 몇 가지 옵션이 있습니다. 당신은 목록 위젯의 마지막 항목으로 on_listWidget_itemDoubleClicked() 함수를 호출 할 수 있습니다 :

QListWidgetItem* item = ui->listWidget->item(ui->listWidget->count()-1); 
this->on_listWidget_itemDoubleClicked(item); 

이럴이 조금 지저분한이다. 왜 파일 이름 매개 변수를 취하는 on_listWidget_itemDoubleClicked()에서 함수를 추출하지 않습니까? 그런 다음, 단지 on_listWidget_itemDoubleClicked()on_actionOpen_File_triggered() 모두에서 함수를 호출 응답에 대한

void MainWindow::on_listWidget_itemDoubleClicked(QListWidgetItem* item) 
{ 
    showModel(item->text()); 
} 

void MainWindow::on_actionOpen_File_triggered() 
{ 
    QFileDialog diag(this); 
    // Code for file dialog goes here. 
    QStringList fileNames; 

    fileNames = diag.getOpenFileNames(this, "Open Model Files", "", 
             "STL Files (*.stl)"); 
    ui->listWidget->addItems(fileNames); 
    showModel(fileNames.last()); 
} 

void MainWindow::showModel(const QString& fileName) 
{ 
    // Code to show model goes here. 
} 
+0

감사합니다. 하지만 여전히 동일한 오류 메시지가 계속 발생합니다. 'Qvector가 실패했습니다 : 인덱스 범위를 벗어남 :'에서 Qvector가 사용되는 위치를 알지 못합니다. – user3734823

+0

@ user3734823 왜이 오류 메시지를 입력하지 않았습니까? 귀하의 질문? 또한 위에 설명한 두 가지 솔루션 중 어느 것을 시도 했습니까? –

+0

@ user3734823 첫 번째 해결 방안에 약간의 실수가있었습니다 - 방금 변경했습니다 –

관련 문제