在我的应用程序中,单击“打开文件”菜单并选择文件时,listwidget
上会添加所选项目(3D对象文件)。如果在列表中双击该项目,该项目将显示在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
为参数。将这两者结合起来对我来说似乎不是一件容易的事。有没有人有想法?不胜感激。
答案 0 :(得分:1)
我想这是因为所选文件尚未添加到listwidget上,并且在同一个函数中双击函数会尝试加载它。
不,这是因为QListWidget::currentItem()
使用焦点检索列表小部件中的项目。仅仅向列表小部件添加项目不会给任何项目焦点,因此QListWidget::currentItem()
返回空指针。
您有几种方法可以解决此问题。您可以使用列表小部件中的最后一项调用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.
}