为什么 lineEdit 会这样显示?

Why lineEdit is showing like this?

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

当 运行 代码时,似乎在主窗口中生成了两个单独的 lineEdit 而不是一个。可能是由于 formclass 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) 导致两个单独的 lineEditself.lineEdit=lineEdit(self.lineEdit) 在主窗口的相同坐标处导致两个重合的 lineEdit 小部件。

任何帮助都会很好...

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

您在

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

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

解释:

您假设第 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>