[Qt] вопрос как идентифицировать QObject

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by mironich, 6 Sep 2012.

  1. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    В общем пишу автоматический сохранитель конфига, тоесть указываешь QWidget он по дереву его детей проходит, и пишет значение из QLineEdit и подобных в файл, все написал кроме установки обратно этого значения которое было в ini файл записано, QObjectName не предлагать, его надо есче установить.
     
    1 person likes this.
  2. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Пройдись в обратном порядке О_о...
    Что именно не получается?
     
  3. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Надо какой то идентификатор уникальный, для QWiget что-то типа хэндла, только неизменяемого после перезапуска программы.
    Вариант, но если будет добавлен виджет между старыми виджетами, будет каша.
    Сейчас использую objectName свойство, но в ручную его прописывать долго, и не практично.
     
  4. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Хм... xml не вариант?
    libconfig - тоже?
    Вообще самый вариант использовать QSettings.
     
  5. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Мы наверно друг друга не до понимаем, я спрашиваю о том как получить идентификатор QWidget, тоесть тоже что и objectName но то что ставиться автоматически.
     
    1 person likes this.
  6. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Возможно, просто сложности тут не вижу.
    Также проходишься потом по дереву, и устанавливаешь значения из файла.
    Получаешь всех детей, проходишься собираешь значения, сохраняешь в файл xml также как и древо, затем проходишься по xml файлу и раздаешь значения всему древу.
    Получай с помощью QObject::metaObject () указатели на метаобъекты...

    (P.S. если опять не так понял, можно подробнее с кодом желательно.)
     
    #6 De-visible, 8 Sep 2012
    Last edited: 8 Sep 2012
    1 person likes this.
  7. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Был такой вариант, но! Если добавить виджет на форму, дерево измениться.
    Вот мой быдло код:
    Code:
    class ConfigWriter():
    	'''
    	Класс реализует запись в .ini файл, содержание следующих виджетов:
    	QLineEdit, QSpinBox, QComboBox
    	У виджетов чье значение необходимо записать в .ini файл,
    	метод getObjectName() должен возвращать не пустую строку.
    	Методы:
    	
    	'''
    	def __init__(self, parent):
    		'''
    		__init__(parent) -> ConfigWriter
    		Ключевые аргументы:
    		parent - Главный виджет окна настройки которого надо записать.
    		'''
    		self._parent = parent
    		self._val_hash = {}
    	
    	
    	def _list_and_get(self, listen_obj):
    		'''
    		Ключевые аргументы:
    		listen_obj - Обьект дочерние виджеты которого будут рекурсивно
    		пройдены.
    		Рекурсивно обходит обьект указанный в listen_obj,
    		и записывает его значения в атрибут _val_hash.
    		'''
    		for obj in listen_obj.children():
    			if not obj.objectName().isEmpty():
    				self._val_hash[str(obj.objectName())] = \
    				self._get_val(obj)
    				
    			if isinstance(obj, QLayout)\
    			or isinstance(obj, QGroupBox):
    				self._list_and_get(obj)
    	
    	def _list_and_set(self, listen_obj):
    		'''
    		Ключевые аргументы:
    		listen_obj - Обьект дочерние виджеты которого будут рекурсивно
    		пройдены.
    		Рекурсивно обходит обьект указанный в listen_obj,
    		и устанавливает ему значения из _val_hash.
    		'''
    		for obj in listen_obj.children():
    			key = str(obj.objectName())
    			if self._val_hash.has_key(key):
                                    #Костыль для записи unicode строк
    				if self._val_hash[key][0] == 'u': 
    					self._val_hash[key] = eval(
    						self._val_hash[key]
    							       )
    
    					
    					
    				self._set_val(obj, self._val_hash[key])
    			if isinstance(obj, QLayout)\
    			or isinstance(obj, QGroupBox):
    				self._list_and_set(obj)