将两个功能合二为一

时间:2015-01-07 23:03:53

标签: c++ qt

在我的应用程序中,单击“打开文件”菜单并选择文件时,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为参数。将这两者结合起来对我来说似乎不是一件容易的事。有没有人有想法?不胜感激。

1 个答案:

答案 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.
}