为什么lineEdit这样显示?

时间:2019-09-08 12:37:34

标签: python python-3.x pyqt pyqt5 qt-designer

我想从导入的lineEdit文件中编辑.ui。我不希望将.ui转换为.py的代码,因为.ui会经常更改,转换成.py并从.py导入对我来说似乎是一个较长的过程。

运行代码时,似乎在主窗口中生成了两个单独的lineEdit而不是一个。可能是由于父类ui导致的父子类关系,但我不明白为什么?

from PyQt5 import QtCore, QtGui, QtWidgets, uic
import sys,re
import pandas as pd
from glob import glob
import os


ui,base=uic.loadUiType("test.ui")
class MainWindow(ui,base):
    def __init__(self, parent=None):
        base.__init__(self,parent)
        # initializes the user interface

        self.setupUi(self)
        self.lineEdit=lineEdit(self.lineEdit)

class lineEdit(QtWidgets.QLineEdit):
     def __init__(self, parent):
        super().__init__(parent)   

        self.parent=parent
        self.setAcceptDrops(True)
        self.setDragEnabled(True)


     def dragEnterEvent(self, event):

        if event.mimeData().hasUrls:

            event.acceptProposedAction()
        else:
            event.ignore() 
     def dragMoveEvent(self, event):
         if event.mimeData().hasUrls:
            event.setDropAction(QtCore.Qt.CopyAction)
            event.acceptProposedAction()
         else:
            event.ignore()
     def dropEvent(self, event):


         mymodel=QtGui.QStandardItemModel()

         if event.mimeData().hasUrls:
            event.setDropAction(QtCore.Qt.CopyAction)

            for url in event.mimeData().urls():
                links=url.toLocalFile()
            self.setText(links)
            return links

if __name__ == "__main__":


    if not QtWidgets.QApplication.instance():
        app = QtWidgets.QApplication(sys.argv)
    else:
        app = QtWidgets.QApplication.instance() 


    MainWindow=MainWindow()
    MainWindow.show()
    app.exec_() 

更改后的self.lineEdit=lineEdit(self)导致两个独立的lineEdit,而self.lineEdit=lineEdit(self.lineEdit)导致两个重合的lineEdit小部件在主窗口的相同坐标处。

任何帮助都很好...

编辑:test.ui在https://drive.google.com/open?id=1oe6z2BaiLYm0mo-nadmDvzsoLHXnwkfm

2 个答案:

答案 0 :(得分:1)

说明:

您假设使用self.lineEdit=lineEdit(self.lineEdit)行代替QLineEdit,不行。用另一个变量替换一个变量并不意味着消除了先前的变量,因为先前的QLineEdit的所有权拥有它Qt,在您的情况下,您表示您正在创建另一个QLineEdit,它将作为第一个的子代,因为您传递了parent作为第一个参数,因此它将位于QLineEdit的位置。

解决方案:

如果要在.ui中使用自定义窗口小部件,则必须升级该窗口小部件,为此,您可以关注以下信息:

考虑到上述情况,解决方案是:

├── lineedit.py
├── main.py
└── test.ui

main.py

import os
import sys

from PyQt5 import QtCore, QtGui, QtWidgets, uic


current_dir = os.path.dirname(os.path.realpath(__file__))

Ui, Base = uic.loadUiType(os.path.join(current_dir, "test.ui"))


class MainWindow(Base, Ui):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)


if __name__ == "__main__":

    app = QtWidgets.QApplication.instance()
    if app is None:
        app = QtWidgets.QApplication(sys.argv)

    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

lineedit.py

from PyQt5 import QtCore, QtWidgets


class LineEdit(QtWidgets.QLineEdit):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setAcceptDrops(True)
        self.setDragEnabled(True)

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls():
            event.acceptProposedAction()
        else:
            event.ignore()

    def dragMoveEvent(self, event):
        if event.mimeData().hasUrls():
            event.acceptProposedAction()
        else:
            event.ignore()

    def dropEvent(self, event):
        if event.mimeData().hasUrls():
            for url in event.mimeData().urls():
                links = url.toLocalFile()
                self.setText(links)

test.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>646</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>A.G_bulucu</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="LineEdit" name="lineEdit">
    <property name="geometry">
     <rect>
      <x>80</x>
      <y>30</y>
      <width>311</width>
      <height>20</height>
     </rect>
    </property>
    <property name="sizePolicy">
     <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
      <horstretch>0</horstretch>
      <verstretch>0</verstretch>
     </sizepolicy>
    </property>
    <property name="maximumSize">
     <size>
      <width>400</width>
      <height>16777215</height>
     </size>
    </property>
    <property name="inputMethodHints">
     <set>Qt::ImhNone</set>
    </property>
    <property name="text">
     <string/>
    </property>
    <property name="frame">
     <bool>true</bool>
    </property>
    <property name="echoMode">
     <enum>QLineEdit::Normal</enum>
    </property>
    <property name="alignment">
     <set>Qt::AlignJustify|Qt::AlignVCenter</set>
    </property>
    <property name="dragEnabled">
     <bool>false</bool>
    </property>
    <property name="clearButtonEnabled">
     <bool>true</bool>
    </property>
   </widget>
   <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>30</y>
      <width>61</width>
      <height>16</height>
     </rect>
    </property>
    <property name="text">
     <string>File</string>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>400</x>
      <y>30</y>
      <width>75</width>
      <height>23</height>
     </rect>
    </property>
    <property name="text">
     <string>open</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>30</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <customwidgets>
  <customwidget>
   <class>LineEdit</class>
   <extends>QLineEdit</extends>
   <header>lineedit</header>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

答案 1 :(得分:0)

您将在

中生成下一个QLineEdit
self.lineEdit=lineEdit(self.lineEdit)

您可以通过代码使用ui进行操作(例如将占位符QWidget替换为LineEdit,并在构造函数中将自定义行编辑放置在此小部件中,或者您可以在QtDesigner中注册自定义小部件。更多信息,请访问:https://doc.qt.io/qt-5/designer-creating-custom-widgets.html