الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ما هي الطريقة الصحيحة لعمل pop-up window في pyqt4 ؟

بدأه new moon في 12 أبريل 2012 · 13 رد · 1,309 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لقد حاولت أن أقوم بعمل نافذة فيها زر يقوم بعرض معلومات بسيطة قمت بحفظها في الدالة على شكل نوافذ منبثقة و لكني لم أنجح رغم المحاولات الكثيرة

و هذا مثال لما قمت بفعله :

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

from PyQt4 import QtCore
from PyQt4 import QtGui
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_About_Main_Window(object):
    def setupUi(self, About_Main_Window):
        About_Main_Window.setObjectName(_fromUtf8("About_Main_Window"))
        About_Main_Window.resize(102, 73)
        About_Main_Window.setWindowTitle(QtGui.QApplication.translate("About_Main_Window", "About", None, QtGui.QApplication.UnicodeUTF8))
        self.centralwidget = QtGui.QWidget(About_Main_Window)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.gridLayout = QtGui.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setText(QtGui.QApplication.translate("About_Main_Window", "About", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)
        About_Main_Window.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(About_Main_Window)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 102, 21))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        About_Main_Window.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(About_Main_Window)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        About_Main_Window.setStatusBar(self.statusbar)
 #########################       
        self.retranslateUi(About_Main_Window)
        QtCore.QMetaObject.connectSlotsByName(About_Main_Window)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.info)
 #########################       
    def info(pushButton):
        QMessageBox.pushButton(self.pushButton, 'Info Message', ''' Info Message Box''',
            QMessageBox.Ok)
 #########################       

    def retranslateUi(self, About_Main_Window):
        pass


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

فأين هو الخطأ ؟ وما هي الطريقة الصحيحة لعمل ذلك ؟

و شكرا لكم

#2

تحتاج تحديد ال ContextMenuPolicy

        self.WIDGET.setContextMenuPolicy( QtCore.Qt.CustomContextMenu )

ثم تربط ال signal

        self.connect(self.WIDGET, QtCore.SIGNAL('customContextMenuRequested(const QPoint&)'), self.context_handler)

    def context_handler(self, point):
         self.popupmenu.exec_( self.WIDGET.mapToGlobal(point) )

http://diotavelli.net/PyQtWiki/Creating%20a%20context%20menu%20for%20a%20tree%20view

تم تعديل هذه المشاركة بواسطة ahmed_youssef في 12 أبريل 2012 في 21:07

2
(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#3
ahmed_youssef كتب:

تحتاج تحديد ال ContextMenuPolicy

        self.WIDGET.setContextMenuPolicy( QtCore.Qt.CustomContextMenu )

ثم تربط ال signal

        self.connect(self.WIDGET, QtCore.SIGNAL('customContextMenuRequested(const QPoint&)'), self.context_handler)

    def context_handler(self, point):
         self.popupmenu.exec_( self.WIDGET.mapToGlobal(point) )

http://diotavelli.net/PyQtWiki/Creating%20a%20context%20menu%20for%20a%20tree%20view

أهلا أخ أحمد ,

لقد فعلت ما قلته ولكن لم تحل المشكلة , و هذا هو الكود بعد التعديل:

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

from PyQt4 import QtCore
from PyQt4 import QtGui
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_About_Main_Window(object):
    def setupUi(self, About_Main_Window):
        About_Main_Window.setObjectName(_fromUtf8("About_Main_Window"))
        About_Main_Window.resize(102, 73)
        About_Main_Window.setWindowTitle(QtGui.QApplication.translate("About_Main_Window", "About", None, QtGui.QApplication.UnicodeUTF8))
        self.centralwidget = QtGui.QWidget(About_Main_Window)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.gridLayout = QtGui.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setText(QtGui.QApplication.translate("About_Main_Window", "About", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)
        About_Main_Window.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(About_Main_Window)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 102, 21))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        About_Main_Window.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(About_Main_Window)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        About_Main_Window.setStatusBar(self.statusbar)
        self.pushButton.setContextMenuPolicy( QtCore.Qt.CustomContextMenu )
 #########################       
        self.retranslateUi(About_Main_Window)
        QtCore.QMetaObject.connectSlotsByName(About_Main_Window)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.info)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL('customContextMenuRequested(const QPoint&)'), self.info)

 #########################       
    def info(self):
        QMessageBox.pushButton(self.pushButton, 'Info Message', ''' Info Message Box''',QMessageBox.Ok)
 #########################       

    def retranslateUi(self, About_Main_Window):
        pass


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

كيف أستطيع تعديل هذا الكود ليعمل بشكل صحيح ؟

#4

up.....

#5

اين هذا السطر ؟

self.popupmenu.exec_( self.WIDGET.mapToGlobal(point) )
(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#6
ahmed_youssef كتب:

اين هذا السطر ؟

self.popupmenu.exec_( self.WIDGET.mapToGlobal(point) )

أضفت السطر و عدلت على الكود كله و لم يحدث شيء أيضا

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

from PyQt4 import QtCore
from PyQt4 import QtGui
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_About_Main_Window(object):
    def setupUi(self, WIDGET):
        WIDGET.setObjectName(_fromUtf8("About_Main_Window"))
        WIDGET.resize(102, 73)
        WIDGET.setWindowTitle(QtGui.QApplication.translate("About_Main_Window", "About", None, QtGui.QApplication.UnicodeUTF8))
        self.centralwidget = QtGui.QWidget(WIDGET)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.gridLayout = QtGui.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setText(QtGui.QApplication.translate("About_Main_Window", "About", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)
        WIDGET.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(WIDGET)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 102, 21))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        WIDGET.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(WIDGET)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        WIDGET.setStatusBar(self.statusbar)
        self.pushButton.setContextMenuPolicy( QtCore.Qt.CustomContextMenu )


 #########################       
        self.retranslateUi(WIDGET)
        QtCore.QMetaObject.connectSlotsByName(WIDGET)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.info)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL('customContextMenuRequested(const QPoint&)'), self.info)
        QtCore.QObject.connect(self.WIDGET, QtCore.SIGNAL('customContextMenuRequested(const QPoint&)'), self.context_handler)



 #########################       
    def info(self):
        QMessageBox.WIDGET(self.pushButton, 'Info Message', ''' Info Message Box''',QMessageBox.Ok)
 #########################       
    def context_handler(self, point):
        self.popupmenu.exec_( self.WIDGET.mapToGlobal(point) )
##################

    def retranslateUi(self, WIDGET):
        pass


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    WIDGET = QtGui.QMainWindow()
    ui = Ui_About_Main_Window()
    ui.setupUi(WIDGET)
    WIDGET.show()
    sys.exit(app.exec_())
#7

الكود لن يعمل self.WIDGET المقصود بيها الويدجت الذي تريد عليه عمل ال popup

ولكن يبدو انك عدلت اسامي بعض المكونات دون النظر لدورها اصلا

فضلا اقرأ هذه المشاركة من جديد

/index.php?showtopic=260650&view=findpost&p=1278336

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#8
ahmed_youssef كتب:

الكود لن يعمل self.WIDGET المقصود بيها الويدجت الذي تريد عليه عمل ال popup

ولكن يبدو انك عدلت اسامي بعض المكونات دون النظر لدورها اصلا

فضلا اقرأ هذه المشاركة من جديد

/index.php?showtopic=260650&view=findpost&p=1278336

هذا ما أقوله من أسبوع قبل وضعي للموضوع ! ما هي الطريقة الصحيحة ﻷني لا أعرف كيف ؟

#9

لاحول ولا قوة إلا بالله

/index.php?showtopic=260650&view=findpost&p=1278336

إستبدل كلمة self.WIDGET بإسم الويدجت الذي تريد عمل ال Popup menu عليه فإذا كان tree بإسم self.tree فإستبدل اسم self.WIDGET ب self.tree

1 −1
(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#10
ahmed_youssef كتب:

لاحول ولا قوة إلا بالله

/index.php?showtopic=260650&view=findpost&p=1278336

إستبدل كلمة self.WIDGET بإسم الويدجت الذي تريد عمل ال Popup menu عليه فإذا كان tree بإسم self.tree فإستبدل اسم self.WIDGET ب self.tree

أولا شكرا على المساعدة

ثانيا أنا لست مبرمج ولا أدرس علوم الحاسب ولا أهتم إن قمت بعمل نوافذ منبثقة أم لا ﻷني لست مجبر في كل الأحوال و أتعلم البرمجة للهواية لا أكثر ولكن لا أجد المساعدة في المواقع العربية

ثالثا نفذت الطريقة و أيضا لا ناتج مقنع , و بعد البحث في المواقع الأجنبية استفدت من هذا الموقع http://stackoverflow.com/questions/4838890/python-pyqt-popup-window

مشكلة المواقع العربية هي عدم التوضيح للمبتدئين . أيام و انا أبحث عن حل مشكلة في المواقع العربية أجدها في موقع أجنبي في 4 دقائق !

دائما ما تكلمون المبتدئين و كأنهم يدرسون علوم الحاسب في الجامعة ولا توضحون ماذا نفعل من البداية مع أن أكثر الذين يتعلمون البرمجة يتعلمونها لمجرد الهواية , و السائل يسأل ﻷنه لا يعرف الجواب ويسأل بعد المحاولة فلا داعي من الشدة في الرد و كانه يطلب منكم حل واجبه

كان من الممكن تعديل الكود لتضح الفكرة لي ولكل من يريد تعلم اللغة

سلام

#11

السلام عللليكم أخي أنا عنندي نفس مشكلتك بس ما عرفت كيف أحلها

حاولت أستخدم نفس الكود في الموقع الاجنبي وغيرت هذي paintEvent التي تقوم بعمليه الرسم وإستبدلتها بشئ بسيط قمت بعمله ببرنامج qt disgner ولكن تتطلع لي النافذه فارغه!!

ليش فين الخطأ !!

هذا الكود

import sys
from PyQt4.Qt import *

class MyPopup(QWidget):
    def __init__(self):
        QWidget.__init__(self)

   # def paintEvent(self, e):
   # class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(400, 300)
        self.label = QtGui.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(100, 60, 46, 13))
        self.label.setObjectName(_fromUtf8("label"))
        self.lineEdit = QtGui.QLineEdit(Form)
        self.lineEdit.setGeometry(QtCore.QRect(50, 130, 113, 20))
        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
        self.pushButton = QtGui.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(210, 130, 75, 23))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))

        self.retranslateUi(Form)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.label.clear)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("Form", "joharah", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("Form", "PushButton", None, QtGui.QApplication.UnicodeUTF8))



class MainWindow(QMainWindow):
    def __init__(self, *args):
        QMainWindow.__init__(self, *args)
        self.cw = QWidget(self)
        self.setCentralWidget(self.cw)
        self.btn1 = QPushButton("Click me", self.cw)
        self.btn1.setGeometry(QRect(0, 0, 100, 30))
        self.connect(self.btn1, SIGNAL("clicked()"), self.doit)
        self.w = None

    def doit(self):
        print "Opening a new popup window..."
        self.w = MyPopup()
        self.w.setGeometry(QRect(100, 100, 400, 200))
        self.w.show()

class App(QApplication):
    def __init__(self, *args):
        QApplication.__init__(self, *args)
        self.main = MainWindow()
        self.connect(self, SIGNAL("lastWindowClosed()"), self.byebye )
        self.main.show()

    def byebye( self ):
        self.exit(0)

def main(args):
    global app
    app = App(args)
    app.exec_()

if __name__ == "__main__":
    main(sys.argv)

لوو جربت هذا الكود تتطلع لك النافذه الثانيه فارغه !!

إش المشكله ياليت تساعدنني

#12
joharah كتب:

السلام عللليكم أخي أنا عنندي نفس مشكلتك بس ما عرفت كيف أحلها

حاولت أستخدم نفس الكود في الموقع الاجنبي وغيرت هذي paintEvent التي تقوم بعمليه الرسم وإستبدلتها بشئ بسيط قمت بعمله ببرنامج qt disgner ولكن تتطلع لي النافذه فارغه!!

ليش فين الخطأ !!

هذا الكود

..........................

لو جربت هذا الكود تتطلع لك النافذه الثانيه فارغه !!

إش المشكله ياليت تساعدنني

إن أردت عمل نوافذ فيها عبارات و جمل يمكنك الإستفادة من هذا الكود الذي وجدته في نفس الموقع أيضا :

#!/usr/bin/python

from PyQt4.QtCore import *
from PyQt4.QtGui import *


class AppForm(QMainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.create_main_frame()       

    def create_main_frame(self):        
        page = QWidget()        

        self.button = QPushButton('click me', page)

        vbox1 = QVBoxLayout()

        vbox1.addWidget(self.button)
        page.setLayout(vbox1)
        self.setCentralWidget(page)

        self.connect(self.button, SIGNAL("clicked()"), self.clicked)

    def clicked(self):
        QMessageBox.about(self, "My message box", '''

thing1: a
thing2: b
thing3: c
         ''' )



if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    form = AppForm()
    form.show()
    app.exec_()

هذا ما وجدته للآن , أتمنى أن يفيدك

تم تعديل هذه المشاركة بواسطة new moon في 19 أبريل 2012 في 12:32

#13

ششششكراً جزيلاً اخي ,, جربت بس ما نفع معي ,, أنا مبتدأه في البايثوون : (

#14
joharah كتب:

ششششكراً جزيلاً اخي ,, جربت بس ما نفع معي ,, أنا مبتدأه في البايثوون : (

هل تستخدم ويندوز ربما ينقصك مكتبات ؟ ﻷن الكود يعمل بشكل جيد على لينكس

وهذه صورتين من عندي توضحان ان الكود يعمل بشكل جيد

الأولى

post-257835-047475600 1334840561_thumb.p

الثانية

post-257835-015354100 1334840541_thumb.p

أنا أيضا مبتدئ جدا في هذه اللغة

المرفقات
shot2.pngshot4.png

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…