PyQt QTreeWidget not displaying content - python

I used the Qt designer to design UI (file: tree_view_widget_ui.py) and I have a class (file: tree_view_widget.py) that creates the widget and shows the data, but data is not displayed. Can anyone tell me what am I doing wrong.
tree_view_widget.py
from tree_view_widget_ui import Ui_Form
class TreeViewWidget(QWidget):
def __init__(self, data2show):
QtGui.QWidget.__init__(self,parent)
self.ui = Ui_Form()
self.ui.setupUi(self)
self.data2show = data2show
self.addItems(self.ui.treeWidget.invisibleRootItem()) #not sure about this line?
def addItems(self, parent):
column = 0
data_group_1 = self.addParent(parent, column, 'Group1', 'data Clients')
for data in self.data2show:
self.addChild(data_item, column, data.prop1, data.prop2)
def addParent(self, parent, column, title, data):
item = QtGui.QTreeWidgetItem(parent, [title])
item.setData(column, QtCore.Qt.UserRole, data)
item.setChildIndicatorPolicy(QtGui.QTreeWidgetItem.ShowIndicator)
item.setExpanded (True)
return item
def addChild(self, parent, column, title, data):
item = QtGui.QTreeWidgetItem(parent, [title])
item.setData(column, QtCore.Qt.UserRole, data)
return item
And the GUI design file (created with Qt Designer):
tree_view_widget_ui.py
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("TreeView"))
Form.setEnabled(True)
Form.resize(200, 400)
Form.setFixedSize(200, 400)
self.treeWidget = QtGui.QTreeWidget(Form)
self.treeWidget.setEnabled(True)
self.treeWidget.setGeometry(QtCore.QRect(0, 0, 200, 400))
self.treeWidget.setFrameShadow(QtGui.QFrame.Sunken)
self.treeWidget.setLineWidth(1)
self.treeWidget.setMidLineWidth(0)
self.treeWidget.setAutoScrollMargin(16)
self.treeWidget.setIndentation(1)
self.treeWidget.setRootIsDecorated(True)
self.treeWidget.setUniformRowHeights(True)
self.treeWidget.setAnimated(False)
self.treeWidget.setColumnCount(0)
self.treeWidget.setObjectName(_fromUtf8("treeWidget"))
self.treeWidget.header().setVisible(False)
self.treeWidget.setHeaderHidden(True)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
Form.setWindowTitle(_translate("Tree View", "Tree View", None))
self.treeWidget.setSortingEnabled(False)
Any suggestions how to change the code that the data will be displayed in the tree shape?

The reason why you are not seeing any of your added items, is because you have set the column count of the tree-widget to zero (in the GUI module).
To fix this, go back to Qt Designer, select your tree-widget and scroll down to the bottom of the Property Editor. Then select the value for columnCount and click the little red arrow on the right to reset it back to the default.
And don't forget to re-generate your GUI module!

Related

Load QDialog directly from UI-File?

I work with QT Designer and create my GUIs with it. To launch the main program, I use this code:
import sys
from PyQt4 import uic, QtGui, QtCore
from PyQt4.QtGui import *
from PyQt4.QtCore import *
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
def main():
app = QtGui.QApplication(sys.argv)
myWindow = MyWindowClass()
myWindow.show()
app.exec_()
main_dialog = uic.loadUiType("GUI.ui")[0]
class MyWindowClass(QtGui.QMainWindow, main_dialog):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.setupUi(self)
if __name__ == "__main__":
main()
So with this line main_dialog = uic.loadUiType("GUI.ui")[0] I define my created UI-File.
Now when I work with QDialogs I have only accomplished to run them by first creating them, then converting them to Python code (using PYUIC4), then implementing the code in my main python file and run the QDialog this way:
def NameOfDialog(self):
dialog = Qdialog()
dialog.ui = NameOfDialogClass()
dialog.ui.setupUi(dialog)
dialog.exec_()
The obvious problem is that whenever I make any tiny change to the GUI I have to go through the entire process again (converting and putting the code in the main code and watch out to not delete any other lines that I added and need to maintain).
I am sure there is a solution to also refer to the UI File of the QDialog directly, but how? I tried the same method like I do for the main window but without success :(
Thanks!
EDIT:
Here is what I have tried in a minimal example, but it's not working. What am I missing?
#-*- encoding: UTF-8 -*-
import sys
from PyQt4 import uic, QtGui, QtCore
from PyQt4.QtGui import *
from PyQt4.QtCore import *
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
def main():
app = QtGui.QApplication(sys.argv)
myWindow = MyWindowClass()
myWindow.show()
app.exec_()
main_dialog = uic.loadUiType("GUI.ui")[0]
TestQDialog = uic.loadUiType("Dialog.ui")[0]
class QDialogClass(object, TestQDialog):
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
class MyWindowClass(QtGui.QMainWindow, main_dialog):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.setupUi(self)
self.btn_close.clicked.connect(self.dialog)
def dialog(self):
dialog = Qdialog()
dialog.ui = QDialogClass()
dialog.ui.setupUi(dialog)
dialog.exec_()
if __name__ == "__main__":
main()
Your dialog class should be defined in exactly the same way as your main-window class. I obviously can't test it myself, but the script should look like this:
import sys
from PyQt4 import uic, QtGui, QtCore
main_dialog = uic.loadUiType("GUI.ui")[0]
TestQDialog = uic.loadUiType("Dialog.ui")[0]
class QDialogClass(QtGui.QDialog, TestQDialog):
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
class MyWindowClass(QtGui.QMainWindow, main_dialog):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.setupUi(self)
self.btn_close.clicked.connect(self.dialog)
def dialog(self):
dialog = QDialogClass()
dialog.exec_()
def main():
app = QtGui.QApplication(sys.argv)
myWindow = MyWindowClass()
myWindow.show()
app.exec_()
if __name__ == "__main__":
main()

python qt designer mouse tracking cursor position

I am making a GUI for touchscreen
Pushbuttons in this GUI should generate signal when mouse cursor is on the pushbuttons
But qt designer does not have that kind of signal (I already tried released, clicked, pressed)
Therefore, I think constantly tracking cursor position can be a solution
However, I have no idea how to implement mouse tracking (such as mousemoveEvent) in the code generated by qt designer and pyuic
If I use the mouse tracking code from other examples, it does not work...
Please help me
Here is the code what contains essential parts only
from PyQt4 import QtCore, QtGui
import sys
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def mouseMoveEvent(self, event):
current = QtGui.QCursor.pos()
x = current.x()
y = current.y()
print("Mouse %d %d" % (x,y))
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(1920, 720)
import resources_rc
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.setMouseTracking(True)
MainWindow.show()
sys.exit(app.exec_())
I solved this problem
I used a code from https://github.com/bkach/earthquakeviz/blob/master/pyqt.py
Making one more class is working
Complete code
from PyQt4 import QtCore, QtGui
import sys
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(1920, 720)
MainWindow.setMouseTracking(True)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setMouseTracking(True)
self.centralwidget.setObjectName("centralwidget")
MainWindow.setCentralWidget(self.centralwidget)
class MainWIndowTest(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.centralwidget.installEventFilter(self)
def eventFilter(self, object, event):
if (event.type() == QtCore.QEvent.MouseMove):
pos = event.pos()
print("%d, %d" % (pos.x(), pos.y()))
return QtGui.QWidget.eventFilter(self, object, event)
def mouseMoveEvent(self, event):
print("Moved")
import resources_rc
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
win = MainWIndowTest()
win.show()
sys.exit(app.exec_())

Pyqt4 QFileDialog Constructor: what to use as parent parameter?

I'm using pyqt4 and python 2.7.11. I have a problem with the file/directory dialogs: I don't know what to use as the parent parameter.
If I use "self" or "None", PyCharm tells me that it's expecting "QFileDialog", and it got "AppTest" and "None" instead, respectively.
If I use "parent=self" or "parent=None", PyCharm tells me that the "self" parameter is unfilled.
Please see the example code below; I'm using Qt Designer to create the ui, let me know if you need that code as well.
import sys
from PyQt4 import QtGui
import ui_test as main_frame
class AppTest(QtGui.QMainWindow, main_frame.Ui_MainAppWindow):
def __init__(self, parent=None):
super(AppTest, self).__init__(parent)
self.setupUi(self)
self.pushButton1.clicked.connect(self.dialog1)
self.show()
def dialog1(self):
file1 = str(QtGui.QFileDialog.getOpenFileName(
parent=self,
caption="Locate file 1",
directory="",
filter="Graphics files (*.jpg *.jpeg)"))
print file1
def main():
app = QtGui.QApplication(sys.argv)
gui = AppTest()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
EDIT: Here's the code for the ui:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'test_ui.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainAppWindow(object):
def setupUi(self, MainAppWindow):
MainAppWindow.setObjectName(_fromUtf8("MainAppWindow"))
MainAppWindow.resize(269, 195)
self.centralwidget = QtGui.QWidget(MainAppWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
self.pushButton1 = QtGui.QPushButton(self.centralwidget)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.pushButton1.sizePolicy().hasHeightForWidth())
self.pushButton1.setSizePolicy(sizePolicy)
self.pushButton1.setObjectName(_fromUtf8("pushButton1"))
self.verticalLayout.addWidget(self.pushButton1)
self.pushButton2 = QtGui.QPushButton(self.centralwidget)
self.pushButton2.setObjectName(_fromUtf8("pushButton2"))
self.verticalLayout.addWidget(self.pushButton2)
MainAppWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainAppWindow)
QtCore.QMetaObject.connectSlotsByName(MainAppWindow)
def retranslateUi(self, MainAppWindow):
MainAppWindow.setWindowTitle(_translate("MainAppWindow", "MainWindow", None))
self.pushButton1.setText(_translate("MainAppWindow", "PushButton1", None))
self.pushButton2.setText(_translate("MainAppWindow", "PushButton2", None))

Changing Pixmap image automatically at runtime in PyQt

I wish to change the image of a pixmap being displayed in a window automatically using a while loop that has a defined delay and uses locations of images stored in a string list.
All possibilities I tried led to the first image being displayed but not changing at runtime.
Any changes gets reflected only after the program has completed all kinds of execution.
from PyQt4 import QtCore, QtGui
import time
import sys
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_Form(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.setupUi(self)
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(598, 555)
self.horizontalLayout = QtGui.QHBoxLayout(Form)
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
self.start_pulse = QtGui.QPushButton(Form)
self.start_pulse.setObjectName(_fromUtf8("start_pulse"))
self.horizontalLayout.addWidget(self.start_pulse)
self.label = QtGui.QLabel(Form)
self.label.setAutoFillBackground(True)
self.label.setText(_fromUtf8(""))
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("GUI.png")))
self.label.setScaledContents(True)
self.label.setObjectName(_fromUtf8("label"))
self.horizontalLayout.addWidget(self.label)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
Form.setWindowTitle(_translate("Form", "Form", None))
self.start_pulse.setText(_translate("Form", "start", None))
self.start_pulse.clicked.connect(self.soumyajit)
def soumyajit(self):
j=0
while(1):
print("change")
if j==0:
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("GUI2.png")))
if j==1:
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("GUI.png")))
if j==2:
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("GUI2.png")))
if j==3:
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("GUI.png")))
j=j+1
#delay
time.sleep(.5)
if __name__=='__main__':
app=QtGui.QApplication(sys.argv)
ex = Ui_Form()
ex.show()
sys.exit(app.exec_())
Following code what I modified from your code, it works well:
Original Code from Changing Pixmap image automatically at runtime in PyQt
Modified for solving problem by WonJong Kim (wjkim#etri.re.kr)
import sys
import time
import numpy
from PyQt4 import QtCore, QtGui
import PyQt4.Qwt5 as Qwt
numPoints=1000
xs=numpy.arange(numPoints)
ys=numpy.sin(3.14159*xs*10/numPoints) #this is our data
try:
fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_Form(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.setupUi(self)
self.index = 0
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(500, 300)
self.horizontalLayout = QtGui.QHBoxLayout(Form)
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
self.start_pulse = QtGui.QPushButton(Form)
self.start_pulse.setObjectName(_fromUtf8("start_pulse"))
self.stop_pulse = QtGui.QPushButton(Form)
self.stop_pulse.setObjectName(_fromUtf8("stop_pulse"))
self.horizontalLayout.addWidget(self.start_pulse)
self.horizontalLayout.addWidget(self.stop_pulse)
self.label = QtGui.QLabel(Form)
self.label.setAutoFillBackground(True)
self.label.setText(_fromUtf8(""))
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("GUI.png")))
self.label.setScaledContents(True)
self.label.setObjectName(_fromUtf8("label"))
self.horizontalLayout.addWidget(self.label)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def refreshUi(self):
if self.index%10==0:
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/10.jpg")))
if self.index%10==1:
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/1.jpg")))
if self.index%10==2:
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/2.jpg")))
if self.index%10==3:
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/3.jpg")))
if self.index%10==4:
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/4.jpg")))
if self.index%10==5:
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/5.jpg")))
if self.index%10==6:
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/6.jpg")))
if self.index%10==7:
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/7.jpg")))
if self.index%10==8:
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/8.jpg")))
if self.index%10==9:
self.label.setPixmap(QtGui.QPixmap(_fromUtf8("Images/9.jpg")))
def retranslateUi(self, Form):
Form.setWindowTitle(_translate("Form", "Form", None))
self.start_pulse.setText(_translate("Form", "start", None))
self.start_pulse.clicked.connect(self.start)
self.stop_pulse.setText(_translate("Form", "stop", None))
self.stop_pulse.clicked.connect(self.stop)
def start(self):
self.timer1.start(500.0) #set the interval (in ms)
def stop(self):
self.timer1.stop() #stop the timer
def change_index(self):
self.index += 1
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
win_plot = Ui_Form()
win_plot.index = 0
win_plot.timer = QtCore.QTimer() #start a timer (to call replot events)
win_plot.timer.start(100.0) #set the interval (in ms)
win_plot.connect(win_plot.timer, QtCore.SIGNAL('timeout()'), win_plot.refreshUi)
win_plot.timer1 = QtCore.QTimer() #start a timer (to call replot events)
win_plot.connect(win_plot.timer1, QtCore.SIGNAL('timeout()'),
win_plot.change_index)
# show the main window
win_plot.show()
sys.exit(app.exec_())
You run your loop in GUI thread so it's freezing your app. It is a bad approach. You should use QTimer instead. Use timeout() signal to do all your image changes inside special slot . QTimer is asynchronous so it will not freeze your app.
You can also call processEvents() inside loop but it is not good solution, timer is better than loop with sleep.

AttributeError: 'Ui_Form' object has no attribute 'printHam_btn'

I'm started learning QtDesigner (Python) with Qt 4.8.6 and I follow this tutorial:
https://www.youtube.com/watch?v=GLqrzLIIW2E
but it showing me sometimes error in title sometimes AttributeError: 'Ui_Form' object has no attribute 'printHam_btn'. Can someone please tell me what i have to do or fix my code.
Thanks!
I know that this problem is already post in this forum but I can't find out what I have to do in my case.
CODE:
from PyQt4 import QtCore, QtGui
import sys
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_Form(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.setupUi(self)
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(400, 300)
self.verticalLayout_2 = QtGui.QVBoxLayout(Form)
self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
self.verticalLayout = QtGui.QVBoxLayout()
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
self.print_ham = QtGui.QPushButton(Form)
self.print_ham.setObjectName(_fromUtf8("print_ham"))
self.verticalLayout.addWidget(self.print_ham)
self.verticalLayout_2.addLayout(self.verticalLayout)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
Form.setWindowTitle(_translate("Form", "Super ham", None))
self.print_ham.setText(_translate("Form", "print ham", None))
self.printHam_btn.clicked.connect(self.printHam)
def printHam(self):
print('Ham!')
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
main_window = Ui_Form()
main_window.show()
sys.exit(app.exec_())
The issue is here:
self.printHam_btn.clicked.connect(self.printHam)
You call your QPushButton instance differently, so you would need to change this line to:
self.print_ham.clicked.connect(self.printHam)

Categories