Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/06/2010, à 00:17

peterp@n

[PyQt] Ouvrir deux QMainWindow [Résolu/Contourné]

Bonjour,
Voilà mon problème :
Je n'arrive pas à afficher une QMainWindow à partir d'une autre.
J'ai fais un "module 1" et je voudrais le lancer à partir d'un autre "module 2".

Je me sers de python 2.6.5, python-qt 4.7.2, Qt 4.6.2, et de QtDesigner et Eric.

Pour expliquer mon problème j'ai créer des codes exemples de ce que je fais.
A partir d'un fichier .ui que je compile j'obtiens le fichier Ui_Window1.py (cf:CODES ↓)
Pour ne pas avoir à faire trop de manip quand je modifie le .ui je lance ce fichier à partir d'un autre : main_Ui_window_1.py (cf:CODES ↓)
C'est le module 1

Maintenant je voudrais lancer ce module 1 à partir d'un autre qui se compose de la même façon.
Le module 2 est donc composé de Ui_Window2.py et main_Ui_Window2.py.(cf:CODES ↓)

Voilà c'est dans main_Ui_Window2.py, je ne sait pas comment lancer le module 1 quand on clique sur le pushButton, je n'arrive pas à coder l'ouverture, l'affichage et la fermeture de la fenêtre du module 1.

Je pense qu'il y a une histoire de parent, ou parfois les erreurs me parle d'instance à lancer en premier.
Mais là je sèche, je trouve pas d'exemple ou de tuto sur le net alors je me tourne vers vous. Si vous avez une idée? ou si vous savez faire? moi j'aimerais comprendre.:D

P.S.: La fonction run dans main_Ui_window1.py est le dernier essai que j'ai fait.

CODES
Ui_Window1.py

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

# Exemple de Ui_Charges_G.py

from PyQt4 import QtCore, QtGui

class Ui_MainWindow_1(object):
    def setupUi(self, MainWindow_1):
        MainWindow_1.setObjectName("MainWindow_1")
        MainWindow_1.resize(295, 146)
        self.centralwidget = QtGui.QWidget(MainWindow_1)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtGui.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)
        MainWindow_1.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow_1)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 295, 21))
        self.menubar.setObjectName("menubar")
        MainWindow_1.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow_1)
        self.statusbar.setObjectName("statusbar")
        MainWindow_1.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow_1):
        MainWindow_1.setWindowTitle(QtGui.QApplication.translate("MainWindow_1", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("MainWindow_1", "PushButton", None, QtGui.QApplication.UnicodeUTF8))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow_1 = QtGui.QMainWindow()
    ui = Ui_MainWindow_1()
    ui.setupUi(MainWindow_1)
    MainWindow_1.show()
    sys.exit(app.exec_())

main_Ui_Window1.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
from Ui_Window1 import *
from PyQt4 import QtGui, QtCore

class Appli_1(Ui_MainWindow_1):
    def hello_world(self):
        if self.label_2.text() == "Hello":
            self.label.setText("Hello")
            self.label_2.setText("World")            
        else:
            self.label.setText("World")
            self.label_2.setText("Hello")

    def setupUi_Appli_1(self, Form):
        Ui_MainWindow_1.setupUi(self, Form)
        
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL
                                ("clicked()"), self.hello_world)
    
    def run(self):
        app = QtGui.QApplication(sys.argv)
        print "run_1"
        self.Fenetre_appli_1 = QtGui.QMainWindow()
        print "run_2"
        self.ui = Appli_1()
        print "run_3"
        self.ui.setupUi_Appli_1(self.Fenetre_appli_1)
        print "run_4"
        self.Fenetre_appli_1.show()
        print "run_5"
        app.exec_()
        print "run ok"
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    Fenetre_appli_1 = QtGui.QMainWindow()
    ui = Appli_1()
    ui.setupUi_Appli_1(Fenetre_appli_1)
    Fenetre_appli_1.show()
    sys.exit(app.exec_())

Ui_Window2.py

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

# Form implementation generated from reading ui file '/home/jo/Programmation/Eurocodes/FreeEurocodes/Multi_Window/Window2.ui'
#
# Created: Wed Jun 23 21:03:21 2010
#      by: PyQt4 UI code generator 4.7.2
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

class Ui_MainWindow_2(object):
    def setupUi(self, MainWindow_2):
        MainWindow_2.setObjectName("MainWindow_2")
        MainWindow_2.resize(295, 146)
        self.centralwidget = QtGui.QWidget(MainWindow_2)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtGui.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)
        MainWindow_2.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow_2)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 295, 21))
        self.menubar.setObjectName("menubar")
        MainWindow_2.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow_2)
        self.statusbar.setObjectName("statusbar")
        MainWindow_2.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow_2):
        MainWindow_2.setWindowTitle(QtGui.QApplication.translate("MainWindow_2", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("MainWindow_2", "PushButton", None, QtGui.QApplication.UnicodeUTF8))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow_2 = QtGui.QMainWindow()
    ui = Ui_MainWindow_2()
    ui.setupUi(MainWindow_2)
    MainWindow_2.show()
    sys.exit(app.exec_())

main_Ui_Window2.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
from Ui_Window2 import *
#from test import *
from main_Ui_Window1 import Appli_1
from PyQt4 import QtGui, QtCore

class Appli_2(Ui_MainWindow_2):
    def essai(self):
        self.fenetre2 = Appli_1.run()
    def setupUi_Appli_2(self, Form):
        Ui_MainWindow_2.setupUi(self, Form)
#        Fenetre_appli_2_1 = QtGui.QMainWindow()
#        self.Fenetre_appli_1 = Appli_2_1()
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL
                                ("clicked()"), self.essai)
#        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL
#                                ("clicked()"), self.Fenetre_appli_1.run_appli_2())

#class Appli_2_1(Appli_1):
#    def run_appli_2(self):
#        Appli_1.run()
#        app2 = QtGui.QApplication(sys.argv)
#        Fenetre_appli_1 = QtGui.QMainWindow()
#        #ui = Appli_1()
#        Appli_1.setupUi_Appli_1(Fenetre_appli_1)
#        Fenetre_appli_1.show()
#        app2.exec_()
#   #Fenetre_appli_2_1 = QtGui.QMainWindow()
#        Appli_1.setupUi_Appli_1(self,  Form)
#   #self.MainWindow_1.show()
#        self.show()
#def setupUi_Appli_2_1(self,  Form):
#   Appli_1.setupUi_Appli_1(self,  Form)        
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    Fenetre_appli_2 = QtGui.QMainWindow()
    ui = Appli_2()
    ui.setupUi_Appli_2(Fenetre_appli_2)
    Fenetre_appli_2.show()
    sys.exit(app.exec_())

Dernière modification par peterp@n (Le 30/06/2010, à 21:27)


Ubuntu 14.04 64bits, Raspbian “wheezy”, Tango Studio sauce debian
Assistance - Développement - Formations FreeCAD (logiciel 3d)

Hors ligne

#2 Le 30/06/2010, à 21:08

vpoulailleau

Re : [PyQt] Ouvrir deux QMainWindow [Résolu/Contourné]

Je pense qu'il y a une histoire de parent, ou parfois les erreurs me parle d'instance à lancer en premier.

Quelle est l'erreur que tu reçois ?

Je ne connais pas python, mais j'utilise Qt. Ça me semble bizarre de vouloir créer 2 mainWindow pour une seule application. Tu es sur du besoin ? Connais tu les notions de MDI/SDI (j'ai une préférence pour MDI, et donc je ne saurai pas plus t'aider) ?

À+
Vincent


Guitaristes, pianistes, batteurs, bassistes, venez chercher des partitions sur :
www.tabs.for.free.fr

Hors ligne

#3 Le 30/06/2010, à 21:26

peterp@n

Re : [PyQt] Ouvrir deux QMainWindow [Résolu/Contourné]

Salut vpoulailleau,

Je n'ai plus d'erreur parceque effectivement 2 QmainWindow c'étais pas logique.

J'ai eu, de la part d'une autre source, une solution pour lancer 2 Qmainwindow, c'est en utilisant subprocess.

Finalement j'ai donc remplacer les Qmainwindow par des QDialog et c'est beaucoup plus simple pour la communication entre les fenêtres. (J'aimais bien la statusBAr des Qmainwindow mais tanpis)

Je n'ai pas de notions de MDI/SDI, ce sera pour plus tard.

Merci de t'être penché sur le sujet wink


Ubuntu 14.04 64bits, Raspbian “wheezy”, Tango Studio sauce debian
Assistance - Développement - Formations FreeCAD (logiciel 3d)

Hors ligne