Skip to content Skip to sidebar Skip to footer

Drag N Drop Button And Drop-down Menu Pyqt/qt Designer

I would like to know the 'best practice' to change the behavior of some buttons to do the following: I want with a click to appear a menu. Or when you drag this same button you cou

Solution 1:

In order to add code to a UI generated with QtDesigner, you must generate a .py file using pyuic:

pyuic myform.ui -o ui_myform.py

This ui_myform.py file, contains generated code that you should not edit, so later you can change your .ui file with QtDesigner, re-run pyuic, and get ui_myform.py updated without loosing any work.

The generated file will have a class Ui_myForm(object) (named after on your main widget's name), with a def setupUi(self, myForm) method inside. One way this can be used, is by creating your own class MyForm (on a separate file) which will inherit Ui_myForm, and some other Qt Class, like QWidget or QDialog:

myform.py:

from ui_myform import Ui_myForm
from PyQt4.QtGui import QDialog

classMyForm(QDialog, Ui_myForm):

    def__init__(self, parent = None):
        QDialog.__init__(self, parent)

        self.setupUi(self)    #here Ui_myForm creates all widgets as members #of this object.#now you can access every widget defined in #myForm as attributes of self   #supposing you defined two pushbuttons on your .UI file:
        self.pushButtonB.setEnabled(False)

        #you can connect signals of the generated widgets
        self.pushButtonA.clicked.connect(self.pushButtonAClicked)



    defbucar_actualizaciones(self):
        self.pushButtonB.setEnabled(True)

The names of the widgets are the one you set on QtDesigner, but is easy to inspect ui_myform.py in order to see the available widgets and names.

In order to use a custom widget in QtDesigner, you can right-click the button, and go to Promote to.... There you'l have to enter:

  • Base class name: QPushButton for example
  • Promoted class name: MyPushButton (this must be the name of the class of your custom widget)
  • Header file: mypushbutton.h. This will be converted to .py by pyuic.

Click Add and then Promote.

When you run pyuic, it will add this line at the end of ui_myform.py

from mypushbutton importMyPushButton

Also, you'll see that the generated code used MyPushButton instead of QPushButton

Solution 2:

My feeling is that you could try to achieve this with standard QWidget, but it would be easier to use QGraphicsScene/QGraphicsView API.

Also, note that you can embed a QWidget in a QGraphicsScene, using QGraphicsProxyWidget.

Solution 3:

If you want to draw a line between the buttons, it means you need to reimplement the "paintEvent" of the background widget (Possibly the parent widget of all subwidgets), as you said, this is NOT the best practice to do so. Instead, you need to use QGraphicsWidget, for drawing line, you need to use QGraphicsLineItem. It have the following member functions:

setAcceptDrops
dragEnterEvent ( QGraphicsSceneDragDropEvent * )
dragLeaveEvent ( QGraphicsSceneDragDropEvent * )
dragMoveEvent ( QGraphicsSceneDragDropEvent * )

In the PyQt4 installation folder, there should exist a folder naming examples\graphicsview\diagramscene, which you take it for a reference.

Post a Comment for "Drag N Drop Button And Drop-down Menu Pyqt/qt Designer"