Reputation: 73
I made a very simple python script to read a sqlite3 database into a QtTableWidget.
import sqlite3 as db
from PyQt4 import QtCore, QtGui
import sys
con = db.connect('results.db', isolation_level=None)
cur = con.cursor()
cur.execute("SELECT * FROM Results")
all_data = cur.fetchall()
class UiDialog(object):
def setupUi(self, datadb):
datadb.setObjectName("Dialog")
datadb.resize(404, 304)
datadb.setWindowTitle("Database results")
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(datadb.sizePolicy().hasHeightForWidth())
datadb.setSizePolicy(sizePolicy)
datadb.setMinimumSize(QtCore.QSize(404, 304))
datadb.setMaximumSize(QtCore.QSize(404, 304))
self.table = QtGui.QTableWidget(datadb)
self.table.setGeometry(QtCore.QRect(2, 2, 400, 261))
self.table.setObjectName("table")
self.show = QtGui.QPushButton(datadb)
self.show.setGeometry(QtCore.QRect(2, 270, 400, 31))
self.show.setObjectName("show")
self.show.setText("Show results")
QtCore.QObject.connect(self.show, QtCore.SIGNAL("clicked()"), self.populate)
QtCore.QMetaObject.connectSlotsByName(datadb)
def populate(self):
self.table.setRowCount(len(all_data))
self.table.setColumnCount(4)
self.table.setHorizontalHeaderLabels(['Number', 'Keys', 'Time', 'Tries'])
for i, item in enumerate(all_data):
number = QtGui.QTableWidgetItem(str(item[0]))
keys = QtGui.QTableWidgetItem(item[1])
time = QtGui.QTableWidgetItem(str(item[2]))
tries = QtGui.QTableWidgetItem(str(item[3]))
self.table.setItem(i, 0, number)
self.table.setItem(i, 1, keys)
self.table.setItem(i, 2, time)
self.table.setItem(i, 3, tries)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
main_conf = QtGui.QDialog()
ui = UiDialog()
ui.setupUi(main_conf)
main_conf.show()
ret = app.exec_()
sys.exit(ret)
It works fine. My question is now:
Is there any way to change the window title dynamically on run time?
setWindowTitle() is not updating on the fly the title bar, nor update() or repaint().
Thank you very much for your precious time!
Upvotes: 1
Views: 14982
Reputation: 1
self.ui.btn_close.clicked.connect(self.btn_close_clicked)
def btn_close_clicked(self): self.close()
Upvotes: -3
Reputation: 1849
Another solution:
class UiDialog(object):
def setupUi(self, datadb):
datadb.setObjectName("Dialog")
datadb.resize(404, 304)
datadb.setWindowTitle("Database results")
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(datadb.sizePolicy().hasHeightForWidth())
datadb.setSizePolicy(sizePolicy)
datadb.setMinimumSize(QtCore.QSize(404, 304))
datadb.setMaximumSize(QtCore.QSize(404, 304))
self.table = QtGui.QTableWidget(datadb)
self.table.setGeometry(QtCore.QRect(2, 2, 400, 261))
self.table.setObjectName("table")
self.show = QtGui.QPushButton(datadb)
self.show.setGeometry(QtCore.QRect(2, 270, 400, 31))
self.show.setObjectName("show")
self.show.setText("Show results")
QtCore.QObject.connect(self.show, QtCore.SIGNAL("clicked()"), lambda: self.populate(datadb)) ### Using LAMBDA function to pass datadb object to the method
#self.show.pressed.connect(lambda: self.populate(datadb)) ### Another syntax for the same operation
QtCore.QMetaObject.connectSlotsByName(datadb)
def populate(self, mainWindow):
self.table.setRowCount(len(all_data))
self.table.setColumnCount(4)
self.table.setHorizontalHeaderLabels(['Number', 'Keys', 'Time', 'Tries'])
for i, item in enumerate(all_data):
number = QtGui.QTableWidgetItem(str(item[0]))
keys = QtGui.QTableWidgetItem(item[1])
time = QtGui.QTableWidgetItem(str(item[2]))
tries = QtGui.QTableWidgetItem(str(item[3]))
self.table.setItem(i, 0, number)
self.table.setItem(i, 1, keys)
self.table.setItem(i, 2, time)
self.table.setItem(i, 3, tries)
mainWindow.setWindowTitle("ANOTHER TITLE")
If you're using a generated code from .ui
file, you can write your MAIN Code into another file and just import the generated ui file into your MAIN Code, so future changes will not affect or change your Main code... so the best solution on my option would be this:
from PyQt4 import QtCore, QtGui
from pyUI import UiDialog ### your UI file, pyUI is the file name and UiDialog is the Ui Class name
import sys
class GUI(QtGui.QDialog):
def __init__(self):
QtGui.QDialog.__init__(self)
self.ui = UiDialog()
self.ui.setupUi(self)
self.ui.show.pressed.connect(self.populate)
def populate(self):
self.ui.table.setRowCount(len(all_data))
self.ui.table.setColumnCount(4)
self.ui.table.setHorizontalHeaderLabels(['Number', 'Keys', 'Time', 'Tries'])
for i, item in enumerate(all_data):
number = QtGui.QTableWidgetItem(str(item[0]))
keys = QtGui.QTableWidgetItem(item[1])
time = QtGui.QTableWidgetItem(str(item[2]))
tries = QtGui.QTableWidgetItem(str(item[3]))
self.ui.table.setItem(i, 0, number)
self.ui.table.setItem(i, 1, keys)
self.ui.table.setItem(i, 2, time)
self.ui.table.setItem(i, 3, tries)
self.setWindowTitle("ANOTHER TITLE")
con = db.connect('results.db', isolation_level=None)
cur = con.cursor()
cur.execute("SELECT * FROM Results")
all_data = cur.fetchall()
app = QtGui.QApplication(sys.argv)
dailog = GUI()
dailog.show()
sys.exit(app.exec_())
Upvotes: 4
Reputation: 2160
def setupUi(self, datadb):
[...]
self.datadb = datadb
def populate(self):
[...]
self.datadb.setWindowTitle('new title')
This works. But you're constructing your widget in a strange and unhandy way. The more conventional one is to use inheritance:
class DatabaseUi(QtGui.QDialog):
def __init__(self):
QtGui.QDialog.__init__(self)
self.table = QtGui.QTableWidget()
self.button = QtGui.QPushButton()
self.button.setText("Show results")
self.button.clicked.connect(self.populate)
vlay = QtGui.QVBoxLayout()
vlay.addWidget(self.table)
vlay.addWidget(self.button)
self.setLayout(vlay)
self.setFixedSize(404, 304)
self.setWindowTitle("Database results")
def populate(self):
self.setWindowTitle('new title')
self.table.setColumnCount(4)
self.table.setHorizontalHeaderLabels(['Number', 'Keys', 'Time', 'Tries'])
[...]
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
ui = DatabaseUi()
ui.show()
sys.exit(app.exec_())
Upvotes: 2