2015-08-18 2 views
1

Я сделал очень простой скрипт python для чтения базы данных sqlite3 в QtTableWidget.PyQT динамически меняет название QMainWindow

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) 

Он отлично работает. Мой вопрос:

Есть ли способ изменить название окна динамически во время выполнения?

setWindowTitle() не обновляет на лету строку заголовка, не обновляет() или не перерисовывает().

Большое спасибо за ваше драгоценное время!

+0

не может найти решение, но изменяющийся в 'QtCore.QObject.connect (сам .show, QtCore.SIGNAL ("clicked()"), self.populate) 'синтаксис, если его нормально изменить его немного, я могу опубликовать его ... – PYPL

+0

Да, пожалуйста, разместите свое решение. – BarnardMikey

ответ

3

Другое решение:

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") 

Если вы используете сгенерированный код из .ui файла, вы можете написать свой основной код в другой файл и только импорт созданный файл пользовательского интерфейса в свой основной код, так и будущие изменения не повлияют или изменить свой основной код ... поэтому лучшим решением на мой вариант был бы этим:

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_()) 
+0

Да, отлично работает! Спасибо! – BarnardMikey

+0

Спасибо, просто написав 'self.setWindowTitle()' _after_ вызов 'self.ui.setupUi()' сделал трюк :) –

1
def setupUi(self, datadb): 
    [...] 
    self.datadb = datadb 

def populate(self): 
    [...] 
    self.datadb.setWindowTitle('new title') 

Это работает. Но вы создаете свой виджет странным и неуправляемым способом. Чем больше обычного заключается в использовании наследования:

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_()) 
+3

Метод, используемый OP, является одним из предложенных методов в документации [PyQt] (http://pyqt.sourceforge.net/Docs/PyQt4/designer.html). Представленный код Python автоматически создается из файла ut QT Designer. Таким образом, рефакторинг кода, как вы это сделали, нецелесообразен, так как это нужно делать каждый раз, когда файл ui изменяется и код Python восстанавливается. Лучше всего было бы предоставить решение, позволяющее избежать проблемы без удаления/изменения метода 'setupUi()'. –

+0

3_pineapples является правильным. Это автоматически сгенерированный код из файла ut Qt Designer. Любое другое предложение? – BarnardMikey

-3

self.ui.btn_close.clicked.connect (self.btn_close_clicked)

Защиту btn_close_clicked (Я): self.close()

+3

Ответ, который вы выдвинули, не имеет ничего общего с вопросом. – eyllanesc

Смежные вопросы