1

ファイル システム内の項目を選択できる がありQFileSystemModelます。QListView

アイテムを選択すると、ファイルパスをQMessageBox.

これまでのところ、次のコードがあります。

filemodel = new QFileSystemModel(this);
filemodel->setFilter(QDir::NoDotAndDotDot | QDir::Files);
filemodel->setNameFilters(filters);
filemodel->setNameFilterDisables(false);
filemodel->setRootPath(sPath);

//get file path
QString filepath = filemodel->fileName(index);
QMessageBox::information(this, "title", filepath);

ui->listView->setModel(filemodel);

これにより、ファイルモデルが作成されます。

次のエラーが表示されます。

mainwindow.cpp:46: エラー: 'QFileSystemModel::fileName(char* (&)(const char*, int))' の呼び出しに一致する関数がありません

これは正しい方法ですか?アイテムが選択されたときにファイルパスを返しますか?

編集@dunc123

コンストラクターで:

connect(ui->listView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(selectedFile(QItemSelection one, QItemSelection two)));

選択したファイル:

void MainWindow::selectedFile(QItemSelection one, QItemSelection two){
    QString file_name = filemodel->fileName(ui->listView->selectionModel()->currentIndex());
    QMessageBox::information(this, "title", file_name);
}

ビルドして実行しますが、ファイルをクリックすると、次のエラーが発生します。

Object::connect: No such slot MainWindow::selectedFile(QItemSelection one, QItemSelection two) in ../Images/mainwindow.cpp:26

Object::connect: (レシーバ名: 'MainWindow')

変数を渡す方法が間違っていると思いますか?

手伝ってくれませんか?

4

3 に答える 3

1

QItemSelectionModel::selectedIndexes()関数を使用して、選択したインデックスのリストを取得できます。

これを使用する方法の例を次に示します。

QModelIndexList list = ui->listView->selectionModel()->selectedIndexes();
foreach (QModelIndex index, list)
{
    QString file_name = fileModel->fileName(index);            
}

または、1 つのアイテムしか選択できない場合は、次のようにQItemSelectionModel::currentIndex関数を使用できます。

QString file_name = fileMode->fileName(ui->listView->selectionModel()->currentIndex());

QItemSelectionModel::selectionChangedシグナルをスロットに接続して、同様の方法で使用することもできます。QListViewオブジェクトの取得に使用できるselectionModel()関数がありQItemSelectionModelます。QItemSelectionを返すindex()QModelIndexList関数があります。

于 2013-08-06T13:45:04.787 に答える
1

QModelIndex オブジェクトを QFileSystemModel の fileName メソッドに渡す必要があります。シンボル「index」が関数として解決されているようです。推測では、クラスに index という名前のメンバー関数があります。

編集:ここでのより大きな問題は、QListView で項目を選択したときに何かを実行したいが、これを処理するコードをコンストラクターに入れていることです。クラスにスロットを作成し、これをアイテムが選択されたときに発行されるシグナルに接続する必要があります。

connect(ui->listView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &), this, SLOT(...));

このスロットでは、fileName メソッドを呼び出して、その情報を表示する必要があります。スロットからアクセスできるように、filemodel もクラスのメンバー変数にする必要があります。

編集 2: 呼び出し時にスロットを指定する方法connectが正しくありません。次のようにする必要があります。

connect(ui->listView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(selectedFile(QItemSelection , QItemSelection)));

ただし、スロットでこれらのパラメーターのいずれも使用していないため、スロットからそれらをすべて一緒に削除できます。たとえば、ヘッダーで次のように定義します。

void selectedFile();

そして、次を使用して接続します。

connect(ui->listView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(selectedFile()));

QT は、信号からのパラメーターのいずれも必要ないことを解決します。

于 2013-08-06T13:15:23.133 に答える
0
QString filepath = filemodel->fileName(index);

mainwindow.cpp:46: error: no matching function for call to 'QFileSystemModel::fileName(char* (&)(const char*, int))'

「インデックス」はQModelIndexではなく関数のようです...

モデルの信号「currentChanged(QModelIndex,QModelIndex)」に接続されているスロットを使用して、新しく選択されたインデックスを取得できます。

于 2013-08-06T13:12:16.950 に答える