Property with a list as possible values for custom widget?
-
wrote on 17 Jan 2017, 07:47 last edited by
I 'm making a custom widget.
I 'm trying to make a property that will have a list of values.
And, in Qt Designer, I 'll be able to choose whichever I want from the list.
So, my question is how do I make such a property?
(that has a list, a combo box)
Like e.g QLabel has the frameShape, or the frameShadow property. -
Hi
I think those are just Qt enums and it should work automatically.
Did not try it though.
Try code from sample and see what you get.http://doc.qt.io/qt-5/properties.html
class MyClass : public QObject { Q_OBJECT Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged) Q_ENUMS(Priority) public: MyClass(QObject *parent = 0); ~MyClass(); enum Priority { High, Low, VeryHigh, VeryLow }; void setPriority(Priority priority) { m_priority = priority; emit priorityChanged(priority); } Priority priority() const { return m_priority; } signals: void priorityChanged(Priority); private: Priority m_priority; };
-
wrote on 17 Jan 2017, 08:16 last edited by
I agree with @mrjj , the only remark is that Q_ENUMS is now deprecated, Q_ENUM should now be used (see https://woboq.com/blog/q_enum.html for further details)
-
I agree with @mrjj , the only remark is that Q_ENUMS is now deprecated, Q_ENUM should now be used (see https://woboq.com/blog/q_enum.html for further details)
wrote on 17 Jan 2017, 08:20 last edited byAnd If I want to change the content of the list dynamically?
The list will contain the names of the widgets that are in the same container as my custom widget.
Let's say I add (in Qt Designer) a new widget in the container.
Can I add the name of this widget in the list? -
And If I want to change the content of the list dynamically?
The list will contain the names of the widgets that are in the same container as my custom widget.
Let's say I add (in Qt Designer) a new widget in the container.
Can I add the name of this widget in the list?@Panoss
Hi ahh yes. That type of list.
Well you can just use a QList or QStringList
Make sure to define both Read and WriteQ_PROPERTY(QList<int> points READ getpoints WRITE putpoints )
(list of ints) -
wrote on 17 Jan 2017, 10:02 last edited by Panoss
I forgot to mention I 'm working in python, so I'm trying to 'translate' your code in python.
I 'll call my property 'ContainersWidgets'.
So, a 'translation' of the above code by mrJJ would be something like:ContainersWidgets = QtCore.pyqtProperty(QList, getContainersWidgets , setContainersWidgets )
Where should '(list of ints)' go?
-
I forgot to mention I 'm working in python, so I'm trying to 'translate' your code in python.
I 'll call my property 'ContainersWidgets'.
So, a 'translation' of the above code by mrJJ would be something like:ContainersWidgets = QtCore.pyqtProperty(QList, getContainersWidgets , setContainersWidgets )
Where should '(list of ints)' go?
@Panoss
Im 110% python noob but it seems yes.
https://wiki.qt.io/Using_Qt_Properties_in_PySidefrom PySide.QtCore import QObject, Property class MyObject(QObject): def ''init''(self,startval=42): QObject.''init''(self) self.ppval = startval def readPP(self): return self.ppval def setPP(self,val): self.ppval = val pp = Property(int, readPP, setPP) obj = MyObject() obj.pp = 47 print (obj.pp)
-
wrote on 17 Jan 2017, 10:23 last edited by Panoss
I use QtGui.QListWidget (the Qt Designer 's QListWidget )
ContainersWidgets = QtCore.pyqtProperty(QtGui.QListWidget, getContainersWidgets, setContainersWidgets)
But how do I set the value?
@QtCore.pyqtSlot(int) def setContainersWidgets(self, value): self._containers_widgets = value
So the variable self._containers_widgets will get the value.
How shall I put this value as selected item from the list?First of all, how shall I refer to the list?(I mean the widget, the QtGui.QListWidget)
list=?? -
I use QtGui.QListWidget (the Qt Designer 's QListWidget )
ContainersWidgets = QtCore.pyqtProperty(QtGui.QListWidget, getContainersWidgets, setContainersWidgets)
But how do I set the value?
@QtCore.pyqtSlot(int) def setContainersWidgets(self, value): self._containers_widgets = value
So the variable self._containers_widgets will get the value.
How shall I put this value as selected item from the list?First of all, how shall I refer to the list?(I mean the widget, the QtGui.QListWidget)
list=??Hi
Sadly I dont know enough python to know.http://pyqt.sourceforge.net/Docs/PyQt4/qstringlist.html#details
-
wrote on 17 Jan 2017, 10:41 last edited by Panoss
Don't worry my friend, 'll find out the way, sooner or later.
I 'm not sure it is correct that I 'm using Qt Designer 's QListWidget in the place of 'QList<int>' you wrote above.
Or maybe I should use QStringList?
The QList you 're referring to, is a widget?I think I should use QStringList in place of your QList.
-
Don't worry my friend, 'll find out the way, sooner or later.
I 'm not sure it is correct that I 'm using Qt Designer 's QListWidget in the place of 'QList<int>' you wrote above.
Or maybe I should use QStringList?
The QList you 're referring to, is a widget?I think I should use QStringList in place of your QList.
Hi
QListWidget is a widget ( listbox) so that is not well for properties.- I think I should use QStringList in place of your QList.
I agree since QList is template based it might be missing as QList.
But QStringList is
class QStringList : public QList<QString>
So very alike.
Maybe this can be used
http://www.programcreek.com/python/example/63681/PyQt4.QtCore.QStringList - I think I should use QStringList in place of your QList.
-
wrote on 17 Jan 2017, 11:03 last edited by
Even though referred in the examples you posted, PyQt4.QtCore.QStringList doesn't exist!!
-
@Panoss
And you have something like
from PyQt4.QtCore import QStringList
or similar import ? -
wrote on 17 Jan 2017, 11:22 last edited by Panoss
I find nothing similar to QStringList in PyQt4.QtCore.
That's quite strange, either it has been moved...or I have no idea! :) -
wrote on 17 Jan 2017, 12:11 last edited by Panoss
From here:
From PyQt4 4.6+ in Python3 QString doesn't exist and you are supposed to use ordinary Python3 unicode objects (string literals). To do this so that your code will work in both Python 2.x AND Python 3.x you can do following:
try: from PyQt4.QtCore import QString except ImportError: # we are using Python3 so QString is not defined QString = type("")
Ok, this for QString.
From here:
The QList class is a template class that provides lists. available in C++ only. But in python, it have python list data-type ready to used. If you want to use behavior like list you can use python list similar QListSo how will I do it? QList = []?
(with '[]' we define a list in python)
-
wrote on 17 Jan 2017, 12:31 last edited by
I tried this:
QList = []
ContainersWidgets = QtCore.pyqtProperty(QList, getContainersWidgets, setContainersWidgets)
But I get an error:
"ContainersWidgets = QtCore.pyqtProperty(QList, getContainersWidgets, setContainersWidgets)
TypeError: bytes or ASCII string expected not 'list'"It doesn't accept a List, only bytes or ASCII.
-
I tried this:
QList = []
ContainersWidgets = QtCore.pyqtProperty(QList, getContainersWidgets, setContainersWidgets)
But I get an error:
"ContainersWidgets = QtCore.pyqtProperty(QList, getContainersWidgets, setContainersWidgets)
TypeError: bytes or ASCII string expected not 'list'"It doesn't accept a List, only bytes or ASCII.
I think you need a python head for this :)
Are you using
https://pypi.python.org/pypi/PyQt5or what version ?
-
wrote on 17 Jan 2017, 12:40 last edited by
The previous version, PyQt4.
-
@Panoss said in Property with a list as possible values for custom widget?:
PyQt4
ok it really should have the qstringlist
-
wrote on 17 Jan 2017, 12:43 last edited by
Yes it should, but it doesn't :) !!!
1/26