Re[6]: Решено: [Python+PyQt] не работает QListWidget.addItem
От: theTosh Россия  
Дата: 03.07.09 00:10
Оценка: 1 (1)
Здравствуйте, DemAS, Вы писали:

DAS>Честно говоря сам не понял, но не работает.

DAS>Хотя, если верить google все правильно:

<..skip..>

DAS>Ну или есть смысл написать в профильную news-группу — может чем помогут.

DAS>Если найдешь ответ, напиши пож-та здесь — мне тоже интересно.

Всё, разобрался. Красивые грабли поймал.

Короче, задумывалось так: при нахождении фокуса ввода в lineEdit1 и нажатии Enter от lineEdit1 должен был посылаться сигнал returnPressed() форме Form1.AddEntry(). Но! У pushButton1 свойство autoDefault == True и получалось, что отсылалось одновременно(?) два сигнала returnPressed() и clicked(), что и приводило к такому замысловатому поведению.

Такое поведение кнопок характерно для QDialog. Так что если бы я наследовался от QMainWindow или, скажем, от QWidget, то всё работало бы как и задумывалось.
/Best regards,
Anton V. Deinow
[Python+PyQt] не работает QListWidget.addItem()
От: theTosh Россия  
Дата: 01.07.09 11:17
Оценка:
Сломал себе уже весь моск. Не могу понять, почему айтемы не добавляются.
Вот такой вот простой код:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import uic

class TdlgMain(QDialog):
  def __init__(self,parent=None):
    QDialog.__init__(self,parent)
    uiClass,qtBaseClass=uic.loadUiType('form1.ui')
    self.ui=uiClass()
    self.ui.setupUi(self)

  def AddEntry(self):
    print 'AddEntry(%r)'%self.ui.lineEdit1.text()
    # ^-- показывает: AddEntry(PyQt4.QtCore.QString(u'тут строка из lineEdit1'))
    # т.е. вроде всё правильно...

    self.ui.listBox1.addItem(self.ui.lineEdit1.text())
    # ^-- тут ничего не происходит :(

if __name__ =='__main__':
  app=QApplication(sys.argv)
  dlgMain=TdlgMain()
  dlgMain.show()
  sys.exit(app.exec_())

form.ui создана в QtDesigner4.
AddEntry() добавлен как слот формы и привязан к сигналу returnPressed() виджета lineEdit1.
listBox1 -- QListWidget, lineEdit1 -- QLineEdit.

Даже уже и не знаю, куда дальше думать...
/Best regards,
Anton V. Deinow
Re: [Python+PyQt] не работает QListWidget.addItem()
От: DemAS http://demas.me
Дата: 01.07.09 12:25
Оценка:
Попробуй строку из LineEdit обернуть в вызов метода:

     def string_wrapper(self, str):
         return QtGui.QApplication.translate("MainWindow", str, None, 
QtGui.QApplication.UnicodeUTF8)
Posted via RSDN NNTP Server 2.1 beta
Re[2]: [Python+PyQt] не работает QListWidget.addItem()
От: theTosh Россия  
Дата: 01.07.09 12:49
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS>Попробуй строку из LineEdit обернуть в вызов метода:


DAS>
DAS>     def string_wrapper(self, str):
DAS>         return QtGui.QApplication.translate("MainWindow", str, None, 
DAS>QtGui.QApplication.UnicodeUTF8)
DAS>

Попробовал. Ничего не изменилось. А какой тайный смысл был в этом финте?

PS. Самое обидное, что при addItem() вообще ничего не происходит. Хоть бы ошибку какую генерил, а то просто возваращает None и тишина.
/Best regards,
Anton V. Deinow
Re[3]: [Python+PyQt] не работает QListWidget.addItem()
От: DemAS http://demas.me
Дата: 01.07.09 13:25
Оценка:
> PS. Самое обидное, что при addItem() вообще ничего не происходит. Хоть бы ошибку какую генерил, а то просто возваращает None и тишина.

А можешь выложить где-нибудь полный проект. Будет время — завтра гляну.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: [Python+PyQt] не работает QListWidget.addItem()
От: theTosh Россия  
Дата: 01.07.09 13:58
Оценка:
Здравствуйте, DemAS, Вы писали:

>> PS. Самое обидное, что при addItem() вообще ничего не происходит. Хоть бы ошибку какую генерил, а то просто возваращает None и тишина.


DAS>А можешь выложить где-нибудь полный проект. Будет время — завтра гляну.


Форма (QtDesigner4):
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form1</class>
 <widget class="QDialog" name="Form1">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>320</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <widget class="QLineEdit" name="lineEdit1">
   <property name="geometry">
    <rect>
     <x>16</x>
     <y>240</y>
     <width>273</width>
     <height>22</height>
    </rect>
   </property>
  </widget>
  <widget class="QListWidget" name="listBox1">
   <property name="geometry">
    <rect>
     <x>16</x>
     <y>16</y>
     <width>369</width>
     <height>209</height>
    </rect>
   </property>
  </widget>
  <widget class="QPushButton" name="pushButton1">
   <property name="geometry">
    <rect>
     <x>296</x>
     <y>240</y>
     <width>83</width>
     <height>26</height>
    </rect>
   </property>
   <property name="text">
    <string>X</string>
   </property>
  </widget>
  <widget class="Line" name="line">
   <property name="geometry">
    <rect>
     <x>8</x>
     <y>272</y>
     <width>385</width>
     <height>16</height>
    </rect>
   </property>
   <property name="orientation">
    <enum>Qt::Horizontal</enum>
   </property>
  </widget>
  <widget class="QPushButton" name="pushButtonOk">
   <property name="geometry">
    <rect>
     <x>208</x>
     <y>288</y>
     <width>83</width>
     <height>26</height>
    </rect>
   </property>
   <property name="text">
    <string>Ok</string>
   </property>
  </widget>
  <widget class="QPushButton" name="pushButtonCancel">
   <property name="geometry">
    <rect>
     <x>304</x>
     <y>288</y>
     <width>83</width>
     <height>26</height>
    </rect>
   </property>
   <property name="text">
    <string>Cancel</string>
   </property>
   <property name="flat">
    <bool>false</bool>
   </property>
  </widget>
 </widget>
 <tabstops>
  <tabstop>listBox1</tabstop>
  <tabstop>lineEdit1</tabstop>
  <tabstop>pushButton1</tabstop>
 </tabstops>
 <resources/>
 <connections>
  <connection>
   <sender>pushButton1</sender>
   <signal>clicked()</signal>
   <receiver>listBox1</receiver>
   <slot>clear()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>333</x>
     <y>254</y>
    </hint>
    <hint type="destinationlabel">
     <x>295</x>
     <y>191</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>lineEdit1</sender>
   <signal>returnPressed()</signal>
   <receiver>Form1</receiver>
   <slot>AddEntry()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>152</x>
     <y>250</y>
    </hint>
    <hint type="destinationlabel">
     <x>199</x>
     <y>140</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButtonOk</sender>
   <signal>clicked()</signal>
   <receiver>Form1</receiver>
   <slot>accept()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>247</x>
     <y>296</y>
    </hint>
    <hint type="destinationlabel">
     <x>185</x>
     <y>292</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButtonCancel</sender>
   <signal>clicked()</signal>
   <receiver>Form1</receiver>
   <slot>reject()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>333</x>
     <y>299</y>
    </hint>
    <hint type="destinationlabel">
     <x>389</x>
     <y>238</y>
    </hint>
   </hints>
  </connection>
 </connections>
 <slots>
  <slot>AddEntry()</slot>
 </slots>
</ui>

Прога:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import uic

class TdlgMain(QDialog):
  def __init__(self,parent=None):
    QDialog.__init__(self,parent)
    uiClass,qtBaseClass=uic.loadUiType('form1.ui')
    self.ui=uiClass()
    self.ui.setupUi(self)

  def AddEntry(self):
    print 'AddEntry(%r)'%self.ui.lineEdit1.text()
    #self.ui.listBox1.addItem('jdksdjs')
    self.ui.listBox1.addItem(self.ui.lineEdit1.text())

if __name__ =='__main__':
  app=QApplication(sys.argv)
  dlgMain=TdlgMain()
  dlgMain.show()
  sys.exit(app.exec_())

Это всё.
/Best regards,
Anton V. Deinow
Re: [Python+PyQt] не работает QListWidget.addItem()
От: theTosh Россия  
Дата: 02.07.09 00:11
Оценка:
Вдогонку:

T>Сломал себе уже весь моск. Не могу понять, почему айтемы не добавляются.

T>Вот такой вот простой код:
<..код поскипан..>
T>Даже уже и не знаю, куда дальше думать...

Более того, выяснилось, что если были айтемы, созданные в дизайнере, то после addItem() они исчезают. Но при этом listBox1.count() возвращает 1, хотя список выглядит пустым (ничего не отображается и не выбирается).

На что это я такое напоролся?..
/Best regards,
Anton V. Deinow
Re[5]: [Python+PyQt] не работает QListWidget.addItem()
От: DemAS http://demas.me
Дата: 02.07.09 08:05
Оценка:
Честно говоря сам не понял, но не работает.
Хотя, если верить google все правильно:

http://wiki.forum.nokia.com/index.php/Item_shifting_in_QlistWidget
http://www.qtcentre.org/forum/f-qt-programming-2/t-qlistwidget-add-qlistwidgetitem-800.html

Попробуй заменить QListWidget на TreeList (или как оно там) — я с ним
работал, все вставлялось.

Ну или есть смысл написать в профильную news-группу — может чем помогут.
Если найдешь ответ, напиши пож-та здесь — мне тоже интересно.
Posted via RSDN NNTP Server 2.1 beta
Re[6]: [Python+PyQt] не работает QListWidget.addItem()
От: theTosh Россия  
Дата: 02.07.09 08:52
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS>Честно говоря сам не понял, но не работает.

DAS>Хотя, если верить google все правильно:

DAS>http://wiki.forum.nokia.com/index.php/Item_shifting_in_QlistWidget

DAS>http://www.qtcentre.org/forum/f-qt-programming-2/t-qlistwidget-add-qlistwidgetitem-800.html
Да и не только это. Если в гугле 'python qlistwidget.additem' набрать, там куча ссылок с примерами. Все юзают просто QListWidget.addItem(u'item') или QListWidget.addItem(QListWidgetItem(u'Item')) и у всех всё работает.

DAS>Попробуй заменить QListWidget на TreeList (или как оно там) — я с ним

DAS>работал, все вставлялось.

Не катит. Мне список нужен, самый простой. Нафига из пушки по воробьям. Уж лучше тогда на gtk пересесть.

DAS>Ну или есть смысл написать в профильную news-группу — может чем помогут.

DAS>Если найдешь ответ, напиши пож-та здесь — мне тоже интересно.
Уже вторые сутки ищу.
Кста, проблема наблюдается только в варианте, когда я форму загружаю из .ui-файла. Если предварительно её через pyuic4 пропустить и написать так:
import form1

class TdlgMain(QDialog,form1.Ui_Form1):
  def __init__(self,parent=None):
    super(TdlgMain,self).__init__(parent)
    self.setupUi(self)

  def AddEntry(self):
    self.listBox1.addItem(self.lineEdit1.text())

if __name__ =='__main__':
  app=QApplication(sys.argv)
  dlgMain=TdlgMain()
  dlgMain.show()
  sys.exit(app.exec_())

все работает. Но этот вариант не катит, ибо а) дополнительный геморой; и б) каша в классе получается.
/Best regards,
Anton V. Deinow
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.