使用PyQt4

时间:2015-11-09 17:20:24

标签: python pyqt qt-designer

使用PyQt4 + QT4.8.4,我想将(外部)文本内容删除到QtDesigner中定义为PyQt4插件的小部件

我使用了两个python类:

  • 从QPyDesignerCustomWidgetPlugin继承的widgetlabelplugin.py
  • 从QLabel继承的widgetlabel.py

覆盖(widgetlabel.py)中的dropEvent,我能够检索"外部文本内容"并设置_model属性。

我执行以下步骤:

  1. 通过先前将PYQTDESIGNERPATH设置为启动设计器 .py路径
  2. 创建一个没有按钮的对话框
  3. 在对话框中删除PyGMT / WiddgetLabel
  4. 删除"文字内容" (从记事本)到widgetlabel标签

    - >在此步骤中,标签在对话框中更新,但不在右侧的属性浏览器上更新

  5. 从Qt设计器工具栏中保存对话框

    - > ui文件不包含任何"文本内容"既不是QLabel / text,也不是WidgetLabel / model

  6. 在Qt设计器中,如果我选择对话框背景并重新选择WidgetLabel,则会在浏览器中更新属性,如果我保存ui,它们仍然无法保存!

  7. python类:widgetlabelplugin.py

    # A demonstration custom widget plugin for PROJECT Qt Designer.
    from PyQt4 import QtGui, QtDesigner
    
    from widgetlabel import WidgetLabel
    
    # This class implements the interface expected by Qt Designer to access the
    # custom widget.  See the description of the QDesignerCustomWidgetInterface
    # class for full details.
    class WidgetLabelPlugin(QtDesigner.QPyDesignerCustomWidgetPlugin):
    
        # Initialise the instance.
        def __init__(self, parent=None):
            super(WidgetLabelPlugin, self).__init__(parent)
    
            self._initialized = False
    
        # Initialise the custom widget for use with the specified formEditor
        # interface.
        def initialize(self, formEditor):
            if self._initialized:
                return
    
            self._initialized = True
    
        # Return True if the custom widget has been intialised.
        def isInitialized(self):
            return self._initialized
    
        # Return a new instance of the custom widget with the given parent.
        def createWidget(self, parent):
            return WidgetLabel(parent)
    
        # Return the name of the class that implements the custom widget.
        def name(self):
            return "WidgetLabel"
    
        # Return the name of the group to which the custom widget belongs.  A new
        # group will be created if it doesn't already exist.
        def group(self):
            return "PyGMT"
    
        # Return the icon used to represent the custom widget in Designer's widget
        # box.
        def icon(self):
            return QtGui.QIcon(":/designer/frame.png")
    
        # Return a short description of the custom widget used by Designer in a
        # tool tip.
        def toolTip(self):
            return "Satis demonstration widget"
    
        # Return a full description of the custom widget used by Designer in
        # "What's This?" help for the widget.
        def whatsThis(self):
            return "WidgetLabel is a demonstration custom widget written in Python " \
                   "using PyQt."
    
        # Return True if the custom widget acts as a container for other widgets.
        def isContainer(self):
            return False
    
        # Return the name of the module containing the class that implements the
        # custom widget.  It may include a module path.
        def includeFile(self):
            return "WidgetLabel"
    

    python类:widgetlabel.py

    #############################################################################
    ##
    ## This file is part of the examples of PROJECT Qt Designer.
    ##
    #############################################################################
    
    from PyQt4 import QtCore, QtGui
    
    # This is the class that implements the custom widget for PROJECT.
    class WidgetLabel(QtGui.QLabel):
    
        #model changed signal
        modelChanged = QtCore.pyqtSignal(QtCore.QString)
    
        # Initialise the instance.
        def __init__(self, parent=None):
            super(WidgetLabel, self).__init__(parent)
            self.setAcceptDrops(True)
            self.setText("Label")
    
            # Initialise the model property. 
            self._model = None
    
    ###########################################################################
                                  # DRAG & DROP PART #
    
    ###########################################################################
        def dragEnterEvent(self, e):
             if e.mimeData().hasFormat("text/plain"):
                 e.setDropAction(QtCore.Qt.CopyAction)
                 e.accept()
             else:
                 e.ignore()
    
        def dragMoveEvent(self, event):
             if event.mimeData().hasFormat("text/plain"):
                 event.setDropAction(QtCore.Qt.CopyAction)
                 event.accept()
             else:
                 event.ignore
    
        def dropEvent(self, e):
             e.acceptProposedAction()
             bStream = e.mimeData().retrieveData("text/plain",
                                                 QtCore.QVariant.ByteArray)
    
             self.setModel(QtCore.QString(str(bStream.toByteArray())))
    
        # The getter for the zoom property.
        def getModel(self):
            return self._model
    
        # The setter for the model property.  We also make define this as a Qt slot
        # which can be connected to Qt signals in Qt Designer.
        @QtCore.pyqtSlot(QtCore.QString)
        def setModel(self, model):
    #        print "new model", model
            # Set QLabel text
            self.setText(model)
    
            # Don't do anything if nothing has changed.
            if self._model == model:
                return
    
            # Remember the new model level.
            self._model = model
    
            # Emit the Qt signal to say that the model level has changed.
            self.modelChanged.emit(model)
    
        # The resetter for the model property.
        def resetModel(self):
            self.setModel(None)
    
        # Define the model property.  Changing the value of this in Qt Designer's
        # property editor causes the model to change dynamically.
        model = QtCore.pyqtProperty(QtCore.QString, getModel, setModel, resetModel)
    
    # Display the custom widget if the script is being run directly from the
    # command line.
    if __name__ == "__main__":
    
        import sys
    
        app = QtGui.QApplication(sys.argv)
    
        demo = WidgetLabel()
        demo.show()
    
        sys.exit(app.exec_())
    

0 个答案:

没有答案