LINUX.ORG.RU

pyqt дочерние окна

 , , ,


0

2

Не могу ничего найти толкового. Хочу сделать в pyqt чтобы по нажатию кнопки в форме, открылась другая форма дочерняя. Вот для этого создал два ui1.py и ui2.py И вот как тепер мне сделать чтобы открылась ui2 из ui1? Пробовал импортировать, делать show() для класса формы, брал советы из форумов, ничего не получается( должен же быть какой-нибудь простой действенный способ. Подскажите добрые люди, пожалуйста_)

Дочерняя форма:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'edit_cards.ui'
#
# Created: Sun Apr 12 21:42:11 2015
#      by: PyQt4 UI code generator 4.9.1
#
# WARNING! All changes made in this file will be lost!

import os
import sys
import sqlite3 as db
from PyQt4 import QtCore, QtGui, QtSql
from PyQt4.QtCore import QStringList, QString
from PyQt4.QtGui  import QApplication, QMainWindow, QSizePolicy
from PyQt4.QtGui  import QTableWidget, QTableWidgetItem
import re

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Card_dialog(object):
    def setupUi(self, Card_dialog):
        Card_dialog.setObjectName(_fromUtf8("Card_dialog"))
        Card_dialog.resize(370, 577)
        Card_dialog.setLocale(QtCore.QLocale(QtCore.QLocale.Russian, QtCore.QLocale.RussianFederation))
        self.verticalLayout = QtGui.QVBoxLayout(Card_dialog)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.label = QtGui.QLabel(Card_dialog)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label.setFont(font)
        self.label.setObjectName(_fromUtf8("label"))
        self.verticalLayout.addWidget(self.label)
        self.manufac_lineEdit = QtGui.QLineEdit(Card_dialog)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.manufac_lineEdit.setFont(font)
        self.manufac_lineEdit.setObjectName(_fromUtf8("manufac_lineEdit"))
        self.verticalLayout.addWidget(self.manufac_lineEdit)
        self.label_2 = QtGui.QLabel(Card_dialog)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label_2.setFont(font)
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.verticalLayout.addWidget(self.label_2)
        self.name_lineEdit = QtGui.QLineEdit(Card_dialog)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.name_lineEdit.setFont(font)
        self.name_lineEdit.setObjectName(_fromUtf8("name_lineEdit"))
        self.verticalLayout.addWidget(self.name_lineEdit)
        self.label_3 = QtGui.QLabel(Card_dialog)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label_3.setFont(font)
        self.label_3.setObjectName(_fromUtf8("label_3"))
        self.verticalLayout.addWidget(self.label_3)
        self.unit_comboBox = QtGui.QComboBox(Card_dialog)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.unit_comboBox.setFont(font)
        self.unit_comboBox.setObjectName(_fromUtf8("unit_comboBox"))
        self.unit_comboBox.addItem(_fromUtf8(""))
        self.unit_comboBox.addItem(_fromUtf8(""))
        self.unit_comboBox.addItem(_fromUtf8(""))
        self.unit_comboBox.addItem(_fromUtf8(""))
        self.unit_comboBox.addItem(_fromUtf8(""))
        self.unit_comboBox.addItem(_fromUtf8(""))
        self.verticalLayout.addWidget(self.unit_comboBox)
        self.label_4 = QtGui.QLabel(Card_dialog)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label_4.setFont(font)
        self.label_4.setObjectName(_fromUtf8("label_4"))
        self.verticalLayout.addWidget(self.label_4)
        self.NDS_comboBox = QtGui.QComboBox(Card_dialog)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.NDS_comboBox.setFont(font)
        self.NDS_comboBox.setObjectName(_fromUtf8("NDS_comboBox"))
        self.NDS_comboBox.addItem(_fromUtf8(""))
        self.NDS_comboBox.addItem(_fromUtf8(""))
        self.NDS_comboBox.addItem(_fromUtf8(""))
        self.verticalLayout.addWidget(self.NDS_comboBox)
        self.label_6 = QtGui.QLabel(Card_dialog)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label_6.setFont(font)
        self.label_6.setObjectName(_fromUtf8("label_6"))
        self.verticalLayout.addWidget(self.label_6)
        self.RU_lineEdit = QtGui.QLineEdit(Card_dialog)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.RU_lineEdit.setFont(font)
        self.RU_lineEdit.setObjectName(_fromUtf8("RU_lineEdit"))
        self.verticalLayout.addWidget(self.RU_lineEdit)
        self.label_5 = QtGui.QLabel(Card_dialog)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label_5.setFont(font)
        self.label_5.setObjectName(_fromUtf8("label_5"))
        self.verticalLayout.addWidget(self.label_5)
        self.calendarWidget = QtGui.QCalendarWidget(Card_dialog)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.calendarWidget.setFont(font)
        self.calendarWidget.setObjectName(_fromUtf8("calendarWidget"))
        self.verticalLayout.addWidget(self.calendarWidget)

        self.retranslateUi(Card_dialog)
        QtCore.QMetaObject.connectSlotsByName(Card_dialog)

    def retranslateUi(self, Card_dialog):
        Card_dialog.setWindowTitle(QtGui.QApplication.translate("Card_dialog", "Карточка товара", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("Card_dialog", "Прозводитель", None, QtGui.QApplication.UnicodeUTF8))
        self.label_2.setText(QtGui.QApplication.translate("Card_dialog", "Наименование", None, QtGui.QApplication.UnicodeUTF8))
        self.label_3.setText(QtGui.QApplication.translate("Card_dialog", "Единица измерения", None, QtGui.QApplication.UnicodeUTF8))
        self.unit_comboBox.setItemText(0, QtGui.QApplication.translate("Card_dialog", "Упаковка", None, QtGui.QApplication.UnicodeUTF8))
        self.unit_comboBox.setItemText(1, QtGui.QApplication.translate("Card_dialog", "Килограммы", None, QtGui.QApplication.UnicodeUTF8))
        self.unit_comboBox.setItemText(2, QtGui.QApplication.translate("Card_dialog", "Штуки", None, QtGui.QApplication.UnicodeUTF8))
        self.unit_comboBox.setItemText(3, QtGui.QApplication.translate("Card_dialog", "Литры", None, QtGui.QApplication.UnicodeUTF8))
        self.unit_comboBox.setItemText(4, QtGui.QApplication.translate("Card_dialog", "Наборы", None, QtGui.QApplication.UnicodeUTF8))
        self.unit_comboBox.setItemText(5, QtGui.QApplication.translate("Card_dialog", "Флаконы", None, QtGui.QApplication.UnicodeUTF8))
        self.label_4.setText(QtGui.QApplication.translate("Card_dialog", "Ставка НДС", None, QtGui.QApplication.UnicodeUTF8))
        self.NDS_comboBox.setItemText(0, QtGui.QApplication.translate("Card_dialog", "10", None, QtGui.QApplication.UnicodeUTF8))
        self.NDS_comboBox.setItemText(1, QtGui.QApplication.translate("Card_dialog", "18", None, QtGui.QApplication.UnicodeUTF8))
        self.NDS_comboBox.setItemText(2, QtGui.QApplication.translate("Card_dialog", "Без НДС", None, QtGui.QApplication.UnicodeUTF8))
        self.label_6.setText(QtGui.QApplication.translate("Card_dialog", "№ РУ", None, QtGui.QApplication.UnicodeUTF8))
        self.label_5.setText(QtGui.QApplication.translate("Card_dialog", "Дата окнчания РУ", None, QtGui.QApplication.UnicodeUTF8))

def show_me():
        window = Ui_Card_dialog()
        window.show()
        return window

#if __name__ == "__main__":
#    app = QtGui.QApplication(sys.argv)
#    Form = QtGui.QWidget()
#    ex = Ui_Card_dialog()
#    ex.setupUi(Form)
#    Form.show()
#    app.exec_()

Главная форма:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'table_cards.ui'
#
# Created: Sun Apr 12 21:42:36 2015
#      by: PyQt4 UI code generator 4.9.1
#
# WARNING! All changes made in this file will be lost!

import os
import sys
import sqlite3 as db
from PyQt4 import QtCore, QtGui, QtSql
from PyQt4.QtCore import QStringList, QString
from PyQt4.QtGui  import QApplication, QMainWindow, QSizePolicy
from PyQt4.QtGui  import QTableWidget, QTableWidgetItem
import re
import edit_cards

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Dialog_cards(object):
    def setupUi(self, Dialog_cards):
        Dialog_cards.setObjectName(_fromUtf8("Dialog_cards"))
        Dialog_cards.resize(826, 518)
        self.gridLayout = QtGui.QGridLayout(Dialog_cards)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.tableWidget_cards = QtGui.QTableWidget(Dialog_cards)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.tableWidget_cards.setFont(font)
        self.tableWidget_cards.setObjectName(_fromUtf8("tableWidget_cards"))
        self.tableWidget_cards.setColumnCount(0)
        self.tableWidget_cards.setRowCount(0)
        self.gridLayout.addWidget(self.tableWidget_cards, 0, 0, 1, 3)
        self.Change_Button = QtGui.QPushButton(Dialog_cards)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.Change_Button.setFont(font)
        self.Change_Button.setObjectName(_fromUtf8("Change_Button"))
        self.gridLayout.addWidget(self.Change_Button, 2, 0, 1, 1)
        self.Delete_Button = QtGui.QPushButton(Dialog_cards)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.Delete_Button.setFont(font)
        self.Delete_Button.setObjectName(_fromUtf8("Delete_Button"))
        self.gridLayout.addWidget(self.Delete_Button, 2, 1, 1, 1)
        self.Close_Button = QtGui.QPushButton(Dialog_cards)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.Close_Button.setFont(font)
        self.Close_Button.setObjectName(_fromUtf8("Close_Button"))
        self.gridLayout.addWidget(self.Close_Button, 2, 2, 1, 1)

        self.retranslateUi(Dialog_cards)
        QtCore.QMetaObject.connectSlotsByName(Dialog_cards)

    def retranslateUi(self, Dialog_cards):
        Dialog_cards.setWindowTitle(QtGui.QApplication.translate("Dialog_cards", "Товары", None, QtGui.QApplication.UnicodeUTF8))
        self.Change_Button.setText(QtGui.QApplication.translate("Dialog_cards", "Изменить товар", None, QtGui.QApplication.UnicodeUTF8))
        QtCore.QObject.connect(self.Change_Button, QtCore.SIGNAL('clicked()'), self.show_edit_window)
        self.Delete_Button.setText(QtGui.QApplication.translate("Dialog_cards", "Удалить товар", None, QtGui.QApplication.UnicodeUTF8))
        self.Close_Button.setText(QtGui.QApplication.translate("Dialog_cards", "Закрыть", None, QtGui.QApplication.UnicodeUTF8))

    def show_edit_window(self):
        import edit_cards
        print 'lol'
        edit_cards.show_me()

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    Form = QtGui.QWidget()
    ex = Ui_Dialog_cards()
    ex.setupUi(Form)
    Form.show()
    app.exec_()



Последнее исправление: wojaovlad (всего исправлений: 1)

Ответ на: комментарий от panter_dsd

А он, кстати, показал. Он выхлоп pyuic-а правил.

Begemoth ★★★★★
()

Создай кнопку, привяжи к кнопке вызов новой формы также, как ты в main делал вызов главного окна

aarexer
()
Ответ на: комментарий от wojaovlad
def another_push_button_clicked(self):
        self.diff_window = DiffWindow()
        self.diff_window.setWindowTitle('Новое окно')
        self.diff_window.show()

А до этого где-нибудь объяви класс DiffWindow. Должно работать, проверь. Или скинь свой код, что не работает.

aarexer
()
Ответ на: комментарий от aarexer

Главное окно (убрал импорт и формирование окна, чтобы не было громоздко):


    def retranslateUi(self, Dialog_cards):
        self.edit_cards_show = edit_cards.Ui_Card_dialog()
        Dialog_cards.setWindowTitle(QtGui.QApplication.translate("Dialog_cards", "Товары", None, QtGui.QApplication.UnicodeUTF8))
        self.Change_Button.setText(QtGui.QApplication.translate("Dialog_cards", "Изменить товар", None, QtGui.QApplication.UnicodeUTF8))
        QtCore.QObject.connect(self.Change_Button, QtCore.SIGNAL('clicked()'), self.show_edit_window)
        self.Delete_Button.setText(QtGui.QApplication.translate("Dialog_cards", "Удалить товар", None, QtGui.QApplication.UnicodeUTF8))
        self.Close_Button.setText(QtGui.QApplication.translate("Dialog_cards", "Закрыть", None, QtGui.QApplication.UnicodeUTF8))

    def show_edit_window(self):
        import edit_cards
        print 'lol'
        self.diff_window = edit_cards.Ui_Card_dialog()
        self.diff_window.show()


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    Form = QtGui.QWidget()
    ex = Ui_Dialog_cards()
    ex.setupUi(Form)
    Form.show()

Дочернее окно которое я пытаюсь вызвать:

    def retranslateUi(self, Card_dialog):
        Card_dialog.setWindowTitle(QtGui.QApplication.translate("Card_dialog", "Карточка товара", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("Card_dialog", "Прозводитель", None, QtGui.QApplication.UnicodeUTF8))
        self.label_2.setText(QtGui.QApplication.translate("Card_dialog", "Наименование", None, QtGui.QApplication.UnicodeUTF8))
        self.label_3.setText(QtGui.QApplication.translate("Card_dialog", "Единица измерения", None, QtGui.QApplication.UnicodeUTF8))
        self.unit_comboBox.setItemText(0, QtGui.QApplication.translate("Card_dialog", "Упаковка", None, QtGui.QApplication.UnicodeUTF8))
        self.unit_comboBox.setItemText(1, QtGui.QApplication.translate("Card_dialog", "Килограммы", None, QtGui.QApplication.UnicodeUTF8))
        self.unit_comboBox.setItemText(2, QtGui.QApplication.translate("Card_dialog", "Штуки", None, QtGui.QApplication.UnicodeUTF8))
        self.unit_comboBox.setItemText(3, QtGui.QApplication.translate("Card_dialog", "Литры", None, QtGui.QApplication.UnicodeUTF8))
        self.unit_comboBox.setItemText(4, QtGui.QApplication.translate("Card_dialog", "Наборы", None, QtGui.QApplication.UnicodeUTF8))
        self.unit_comboBox.setItemText(5, QtGui.QApplication.translate("Card_dialog", "Флаконы", None, QtGui.QApplication.UnicodeUTF8))
        self.label_4.setText(QtGui.QApplication.translate("Card_dialog", "Ставка НДС", None, QtGui.QApplication.UnicodeUTF8))
        self.NDS_comboBox.setItemText(0, QtGui.QApplication.translate("Card_dialog", "10", None, QtGui.QApplication.UnicodeUTF8))
        self.NDS_comboBox.setItemText(1, QtGui.QApplication.translate("Card_dialog", "18", None, QtGui.QApplication.UnicodeUTF8))
        self.NDS_comboBox.setItemText(2, QtGui.QApplication.translate("Card_dialog", "Без НДС", None, QtGui.QApplication.UnicodeUTF8))
        self.label_6.setText(QtGui.QApplication.translate("Card_dialog", "№ РУ", None, QtGui.QApplication.UnicodeUTF8))
        self.label_5.setText(QtGui.QApplication.translate("Card_dialog", "Дата окнчания РУ", None, QtGui.QApplication.UnicodeUTF8))

def show_me():
    Form = QtGui.QWidget()
    ex = Ui_Card_dialog()
    ex.setupUi(Form)
    ex.show()


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    Form = QtGui.QWidget()
    ex = Ui_Card_dialog()
    ex.setupUi(Form)
    Form.show()
    app.exec_()

Выводит такую ошибку:

AttributeError: 'Ui_Card_dialog' object has no attribute 'show'

Если я вызываю такую функцию из дочернего окна:

def show_me():
    app = QtGui.QApplication(sys.argv)
    Form = QtGui.QWidget()
    ex = Ui_Card_dialog()
    ex.setupUi(Form)
    Form.show()
    app.exec_()
то получаю такую ошибку:
QCoreApplication::exec: The event loop is already running

wojaovlad
() автор топика
Ответ на: комментарий от wojaovlad

Должен быть класс главного окна и класс дочернего окна. Это должны быть классы, унаследованные от того, чего надо вам, например, QDialog или QWidget. Вы должны создавать экземпляр класса и вызывать у него метод show. Главное окно вы вызываете в __main__, дочернее уже по какому-то событию. Где класс дочернего и главного окна?Покажите.

aarexer
()
Ответ на: комментарий от aarexer

К сожалению не очень понимаю момент импорта. Если я импортирую программу с дочерним окном, каким образом мне создать экземпляр класса и его вызвать в главной программе? Можете пример помести?

wojaovlad
() автор топика
Ответ на: комментарий от wojaovlad

Ну что-то типа

import DiffWindow

def another_push_button_clicked(self):
        # Создаем экземпляр класса
        self.diff_window = DiffWindow.DiffWindow()
        self.diff_window.setWindowTitle('Новое окно')
        self.diff_window.show()
Где в модуле DiffWindow есть класс DiffWindow.

Так понятней?

aarexer
()
Ответ на: комментарий от aarexer

Да, вроде бы понятно. Но вот я попробовал сделать так же, как вы описали, а мне выдаёт ошибку

AttributeError: 'Ui_Card_dialog' object has no attribute 'setWindowTitle'

Вот как я сделал:

    import edit_cards

    def show_edit_window(self):
        print 'lol'
        self.diff_window = edit_cards.Ui_Card_dialog()
        self.diff_window.setWindowTitle('new')
        self.diff_window.show()

Я посомтрел как у меня в импортируемом файле задаётся setWindowTitle:

Card_dialog.setWindowTitle(QtGui.QApplication.translate("Card_dialog", "Карточка товара", None, QtGui.QApplication.UnicodeUTF8))

А так это выглядит в функции setup_ui:

class Ui_Card_dialog(object):
    def setupUi(self, Card_dialog):
        Card_dialog.setObjectName(_fromUtf8("Card_dialog"))
        Card_dialog.resize(370, 577)
        Card_dialog.setLocale(QtCore.QLocale(QtCore.QLocale.Russian, QtCore.QLocale.RussianFederation))

Вот я немного в замешательстве теперь.

wojaovlad
() автор топика
Ответ на: комментарий от wojaovlad

Ну дак это все не верно. Где же тут Qt?) class Ui_Card_dialog(object): - унаследуйтесь от необходимого вам класса. Где у вас класс главного окна? Где у вас класс второго окна?

aarexer
()
Ответ на: комментарий от aarexer

Я не понимаю( Создать класс в файле главного окна, который наслеудует класс дочернего окна?

class second_window(edit_cards.Ui_Card_dialog):

Класс главного окна:

class Ui_Dialog_cards(object):
Класс дочернего окна:
class Ui_Card_dialog(object):

wojaovlad
() автор топика
Ответ на: комментарий от wojaovlad

Нет! Так не верно, ну унаследовались вы от object и что? Пример:

class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        QToolTip.setFont(QFont('SansSerif', 10))

        self.setToolTip('This is a <b>QWidget</b> widget')

        btn = QPushButton('Button', self)
        btn.setToolTip('This is a <b>QPushButton</b> widget')
        btn.resize(btn.sizeHint())
        btn.move(50, 50)

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Tooltips')
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
Главное окно. Т.е вы унаследовались от QWidget-а, и описали класс окна. А после уже (в main-е) вы создали ОБЪЕКТ класса и так как в конструкторе у нас есть def initUI(self): - в котором у нас show(), то окно отрисуется. Со вторым окном то же самое, только, например, по нажатию кнопки, вы должны экземпляр класса создавать(объект).

Понятно?

aarexer
()
Ответ на: комментарий от aarexer

Что-то получается. Сделал так:

    def retranslateUi(self, Dialog_cards):
        self.edit_cards_show = second_window()
        Dialog_cards.setWindowTitle(QtGui.QApplication.translate("Dialog_cards", "Товары", None, QtGui.QApplication.UnicodeUTF8))
        self.Change_Button.setText(QtGui.QApplication.translate("Dialog_cards", "Изменить товар", None, QtGui.QApplication.UnicodeUTF8))
        QtCore.QObject.connect(self.Change_Button, QtCore.SIGNAL('clicked()'), self.edit_cards_show.show_edit_window)
        self.Delete_Button.setText(QtGui.QApplication.translate("Dialog_cards", "Удалить товар", None, QtGui.QApplication.UnicodeUTF8))
        self.Close_Button.setText(QtGui.QApplication.translate("Dialog_cards", "Закрыть", None, QtGui.QApplication.UnicodeUTF8))



class second_window(QtGui.QMainWindow, Ui_Card_dialog):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setupUi(self)
    def show_edit_window(self):
        self.show()

Но вот только как-то криво отрисовывется второе окно и выдаёт при запуске такую штуку:

QLayout: Attempting to add QLayout "" to second_window "Card_dialog", which already has a layout

wojaovlad
() автор топика
Ответ на: комментарий от wojaovlad

Ниче не понятно. Вы не пихайте все в кучу! Сначала сделайте окно и кнопку.Сделали? Теперь сделайте второе окно, как первое. Теперь по нажатию кнопки отображайте второе окно.

aarexer
()
Ответ на: комментарий от aarexer

Вот что-то такое:

# -*- coding: utf-8 -*-

import sys
from PyQt4.Qt import QMainWindow, QWidget, QApplication, QIcon, QDesktopWidget
from PyQt4 import QtGui, QtCore


class Example(QMainWindow):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()
    def initUI(self):
        self.statusBar().showMessage('Ready')
        self.maket()
        self.setGeometry(300, 300, 300, 220)
        self.setWindowTitle('Icon')
        self.setWindowIcon(QIcon('web.png'))
        self.center()
        self.show()
    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())
    def maket(self):
        self.settings_widget = SettingsWidgets()
        settings = QtGui.QPushButton('Настройки', self)
        settings.move(55, 110)
        settings.setToolTip('Нажмите для изменения настроек')
        self.connect(settings, QtCore.SIGNAL('clicked()'), self.settings_widget)


class SettingsWidgets(QWidget):
    def __init__(self):
        super(SettingsWidgets, self).__init__()

    def __call__(self, *args, **kwargs):
        self.setWindowTitle("Настройки")
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Только не очень понятен такой момент:

    def __call__(self, *args, **kwargs):
И что такое super.

wojaovlad
() автор топика
Ответ на: комментарий от wojaovlad

super(...).__init__() - это вызов конструктора родительского класса(от которого отнаследовались). Соответственно, логично предположить, что super() - это тот мостик, что соединяет нас и родительский класс. Поняли зачем нужен он? def __call__(self, *args, **kwargs) - это вам зачем?

def maket(self):
        self.settings_widget = SettingsWidgets()
        settings = QtGui.QPushButton('Настройки', self)
        settings.move(55, 110)
        settings.setToolTip('Нажмите для изменения настроек')
        self.connect(settings, QtCore.SIGNAL('clicked()'), self.settings_widget)

В общем, вы не очень понимаете, что пишите. Вы поймите, что у вас есть класс Окна.

class Example(QMainWindow): - при создании объекта этого класса у вас вызовется конструктор, def __init__(self):, в нем вы обратитесь к def initUI(self):, а в ней уже вы задаете параметры окна вашего. Окно у вас должно создаваться, но пустое. вы не добавили на него ни кнопку, ничего. Зато вызываете self.maket(), т.е у вас одновременно еще создается(пытается) окно SettingsWidgets. Там вы создаете еще кнопку, двигаете ее куда то(не привязав к окну, кнопка - сама по себе), а ваше коннект я вообще не понял зачем и что делает.

Итак. Делайте простое окно, добавляете на него кнопку. Создаете метод maket ваш коннект(нажатие на кнопку) делаете на него. Сам коннект вы делаете в конструкторе главного окна. В макете вы просто создаете объект нового окна. SettingsWidgets - сделайте также, как и первое, т.е

def __init__(self):
        super(...., self).__init__()
        self.initUI()
    def initUI(self):....
Где там задайте параметры окна.

Прочитайте бегло книжку по PyQt4(раз вы его используетете) Прохоренок автор.А то у вас намешано все про все и вы в этой куче дергаете что видите. Постарайтесь разобраться!

aarexer
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.