Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: darktroll от Май 16, 2010, 16:55



Название: QTreeView + QFileSystemModel: как получить filePath
Отправлено: darktroll от Май 16, 2010, 16:55
Доброго времени суток, уважаемые знатоки!
У меня вопрос, который меня мучает довольно долго. Значит, есть форма, на ней расположил QTreeView и с вязал с ним QFileSystemModel. Все ок, по папкам ходить могу.
У QFileSystemModel есть функция filePath, которая возвращает путь файла под индексом. Вопрос в том, как мне получить этот путь? Если можно, покажите на маленьком примере.

Премного благодарен!


Название: Re: QTreeView + QFileSystemModel: как получить filePath
Отправлено: Авварон от Май 16, 2010, 17:54
зависит от того, какой индекс и как вы его получать собираетесь


Название: Re: QTreeView + QFileSystemModel: как получить filePath
Отправлено: lit-uriy от Май 16, 2010, 19:02
примерно так:
Код
C++ (Qt)
treeView->setModel(model);
connect(treeView->selectionModel(),
SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),
this,
SLOT(directoryChanged(const QModelIndex &, const QModelIndex &)));
 
Т.е. делаешь себе слот directoryChanged, с ним соединяешь сигнал от модели выделения, полученной у представления. Когда выделение в представлении меняется, то модель выделения посылает сигнал.


Название: Re: QTreeView + QFileSystemModel: как получить filePath
Отправлено: darktroll от Май 16, 2010, 20:29
lit-uriy, спасибо огромное! То, что нужно!
Так как я пишу на PyQt, то вот что получилось (мало ли кому пригодится):
Код
Python
QtCore.QObject.connect(self.treeview.selectionModel(), QtCore.SIGNAL('currentChanged(const QModelIndex, const QModelIndex)'), self.directoryChanged)
 
def directoryChanged(self,a,b):
c = self.treeview.model().filePath(a)
print c
 

Я только изучаю Python и Qt, поэтому многие очевидные вещи мне кажутся сложными. Например:
1. Зачем в сигнале два раза пишется const QModelIndex?
2. Если в слоте сделать c = self.treeview.model().filePath(a), то выдается путь текущего выделенного элемента, а если c = self.treeview.model().filePath(b), то выдается путь элемента от предыдущего нажатия. Почему?

Если не займет много времени, поясните пожалуйста.... :)


Название: Re: QTreeView + QFileSystemModel: как получить filePath
Отправлено: ритт от Май 16, 2010, 20:43
читай документацию QAbstractItemView::currentChanged
и вообще читай документацию - она хорошая


Название: Re: QTreeView + QFileSystemModel: как получить filePath
Отправлено: darktroll от Май 16, 2010, 20:53
Спасибо, документация действительно хорошая, объёмная, но в ней часто сложно найти нужную инфу.
А directoryChanged не существует у QFileSystemModel. Ее предполагалось создать, что я и сделал.

Пофиксил:
читай документацию  QAbstractItemView::currentChanged
и вообще читай документацию - она хорошая
;)
Всем огромное спасибо!


Название: Re: QTreeView + QFileSystemModel: как получить filePath
Отправлено: lit-uriy от Май 16, 2010, 21:15
>>QtCore.QObject.connect
а зачем ты так пишешь? Если ты делаешь соединение внутри класса наследника QObject, то ему доступна функция connect


Название: Re: QTreeView + QFileSystemModel: как получить filePath
Отправлено: lit-uriy от Май 16, 2010, 21:19
Цитировать
1. Зачем в сигнале два раза пишется const QModelIndex?
2. Если в слоте сделать c = self.treeview.model().filePath(a), то выдается путь текущего выделенного элемента, а если c = self.treeview.model().filePath(b), то выдается путь элемента от предыдущего нажатия. Почему?
в доке написано:
Цитировать
void QItemSelectionModel::currentChanged ( const QModelIndex & current, const QModelIndex & previous )   [signal]

This signal is emitted whenever the current item changes. The previous model item index is replaced by the current index as the selection's current item.


Название: Re: QTreeView + QFileSystemModel: как получить filePath
Отправлено: darktroll от Май 16, 2010, 21:55
>>QtCore.QObject.connect
а зачем ты так пишешь? Если ты делаешь соединение внутри класса наследника QObject, то ему доступна функция connect

Класс наследуется от QtGui.QMainWindow.
А про currentChanged уже прочел, спасибо.


Название: Re: QTreeView + QFileSystemModel: как получить filePath
Отправлено: lit-uriy от Май 16, 2010, 22:47
>>Класс наследуется от QtGui.QMainWindow.
дак QMainWindow потомок QObject, также как и QWidget


Название: Re: QTreeView + QFileSystemModel: как получить filePath
Отправлено: darktroll от Май 17, 2010, 22:55
>>Класс наследуется от QtGui.QMainWindow.
дак QMainWindow потомок QObject, также как и QWidget

И тем не менее выдает Python выдает ошибку "global name 'connect' is not defined". Я в ООП еще слишком слаб, поэтому может я чего намудрил. У меня вот как:
Код
Python
class pyfileman_gui(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
               ........................
               ##описание формы
 
       def tree_columns(self):
                .......................
                QtCore.QObject.connect(self.treeview.selectionModel(), QtCore.SIGNAL('currentChanged(const QModelIndex, const QModelIndex)'), self.selected_item_path)
                .......................
 

Сомневаюсь, что этот кусок чем-то будет полезен, но может здесь чего не так?