Russian Qt Forum
Ноябрь 26, 2024, 12:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeView + QFileSystemModel: как получить filePath  (Прочитано 8379 раз)
darktroll
Гость
« : Май 16, 2010, 16:55 »

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

Премного благодарен!
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Май 16, 2010, 17:54 »

зависит от того, какой индекс и как вы его получать собираетесь
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Май 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, с ним соединяешь сигнал от модели выделения, полученной у представления. Когда выделение в представлении меняется, то модель выделения посылает сигнал.
Записан

Юра.
darktroll
Гость
« Ответ #3 : Май 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), то выдается путь элемента от предыдущего нажатия. Почему?

Если не займет много времени, поясните пожалуйста.... Улыбающийся
Записан
ритт
Гость
« Ответ #4 : Май 16, 2010, 20:43 »

читай документацию QAbstractItemView::currentChanged
и вообще читай документацию - она хорошая
« Последнее редактирование: Май 17, 2010, 06:08 от Константин » Записан
darktroll
Гость
« Ответ #5 : Май 16, 2010, 20:53 »

Спасибо, документация действительно хорошая, объёмная, но в ней часто сложно найти нужную инфу.
А directoryChanged не существует у QFileSystemModel. Ее предполагалось создать, что я и сделал.

Пофиксил:
читай документацию  QAbstractItemView::currentChanged
и вообще читай документацию - она хорошая
Подмигивающий
Всем огромное спасибо!
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Май 16, 2010, 21:15 »

>>QtCore.QObject.connect
а зачем ты так пишешь? Если ты делаешь соединение внутри класса наследника QObject, то ему доступна функция connect
Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Май 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.
Записан

Юра.
darktroll
Гость
« Ответ #8 : Май 16, 2010, 21:55 »

>>QtCore.QObject.connect
а зачем ты так пишешь? Если ты делаешь соединение внутри класса наследника QObject, то ему доступна функция connect

Класс наследуется от QtGui.QMainWindow.
А про currentChanged уже прочел, спасибо.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Май 16, 2010, 22:47 »

>>Класс наследуется от QtGui.QMainWindow.
дак QMainWindow потомок QObject, также как и QWidget
Записан

Юра.
darktroll
Гость
« Ответ #10 : Май 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)
                .......................
 

Сомневаюсь, что этот кусок чем-то будет полезен, но может здесь чего не так?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.088 секунд. Запросов: 23.