где я могу написать класс для одного рекламируемого QWidget от Qt designer - PullRequest
1 голос
/ 21 марта 2020

Я читаю, тестирую и понимаю много примеров использования QWidgets из Qt designer, которые продвигаются до PyQt5. Тем не менее я не могу разобраться с простым примером для себя.

Ниже я показываю свой код, который не работает, и пытаюсь объяснить.

в Qt desginer я создаю простое QMainWindow , названный стандартизированным как MainWindow

Внутри я создаю одну метку QLabel. Это я продвигаю в классе "neuLabel" и называю его labelqt. Окно с, Добавить, заголовок neulabel.h и продвигать -> все хорошо.

Я понимаю, что мне нужно написать код для класса neuLabel. Но: ГДЕ это сделать?

С очень простым примером я попробовал это так:

from PyQt5 import QtWidgets, uic
import sys
uifile_1 = 'testpromote.ui'
form_1, base_1 = uic.loadUiType(uifile_1)
class neuLabel(QLabel, QPixmap):
    def __init__(self,title,pixmap,parent):
    super().__init__(title,parent)
    self.setAcceptDrops(True)
def mousePressEvent(self, e):
    QLabel.mousePressEvent(self, e)
    if e.button() == QtCore.Qt.LeftButton:
        print('press')
class myApp(base_1, form_1):
    def __init__(self):
        super(base_1,self).__init__()
        self.setupUi(self)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = myApp()   #Dialog()
    ex.show()
sys.exit(app.exec_())

Ошибка такая:

Traceback (most recent call last):
  File "/home/jf/PycharmProjects/myMuhaInp/testpromote.py", line 5, in <module>
    form_1, base_1 = uic.loadUiType(uifile_1)
  File "/usr/lib/python3/dist-packages/PyQt5/uic/__init__.py", line 201, in loadUiType
    exec(code_string.getvalue(), ui_globals)
  File "<string>", line 37, in <module>
ModuleNotFoundError: No module named 'neulabel'

Я действительно не знаю Я не понимаю, ГДЕ для кодирования класса neulabel (и я действительно пробовал много примеров. (Я не нашел ни одного примера, это продвижение одного QWidget)

1 Ответ

0 голосов
/ 21 марта 2020

Прежде чем во всем вашем коде будет ошибка: зачем вам класс, унаследованный от QLabel и QPixmap? Я не вижу смысла, QLabel использует QPixmap (композиция), QLabel это не QPixmap (инерность).

Для Для продвижения виджета он должен иметь следующие правила (я не нашел их в документации):

  • Конструктор виджета должен иметь один параметр и быть его родителем.

  • Класс не должен находиться в том же файле, где он используется, поскольку он может создавать циклический импорт.

  • Форма продвижения виджета запрашивает 2 данные:

    1. Имя повышенного класса , которое должно быть именем класса.
    2. Заголовочный файл , в котором должно находиться местоположение файл, в котором находится класс (в C ++ по пользовательскому правилу имя файла совпадает с именем класса, но с строчными буквами, но в python оно не соответствует).

    Например, если «FooClass» помещен как Имя повышенного класса , а «a / b / c» или «ab c» помещено в * 103 7 * Заголовочный файл будет переведен в from a.b.c import Foo, поэтому убедитесь, что это правильно.

Пример:

Учитывая выше, самая простая реализация состоит в том, чтобы создать .py, где класс для продвижения будет:

neulabel.py

from PyQt5 import QtCore, QtWidgets


class NeuLabel(QtWidgets.QLabel):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setAcceptDrops(True)

    def mousePressEvent(self, e):
        super().mousePressEvent(e)
        if e.button() == QtCore.Qt.LeftButton:
            print("press")

Затем в .ui вы должны заполните следующую форму, нажмите кнопку «Добавить», а затем кнопку «Продвинуть»

enter image description here

Создание следующего .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>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="NeuLabel" name="label">
    <property name="geometry">
     <rect>
      <x>120</x>
      <y>160</y>
      <width>251</width>
      <height>191</height>
     </rect>
    </property>
    <property name="text">
     <string>TextLabel</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>26</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <customwidgets>
  <customwidget>
   <class>NeuLabel</class>
   <extends>QLabel</extends>
   <header>neulabel</header>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

Затем используется в основном файле:

import os
import sys

from PyQt5 import QtWidgets, uic

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

uifile_1 = os.path.join(CURRENT_DIR, "testpromote.ui")
form_1, base_1 = uic.loadUiType(uifile_1)


class myApp(base_1, form_1):
    def __init__(self):
        super(base_1, self).__init__()
        self.setupUi(self)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    ex = myApp()
    ex.show()
    sys.exit(app.exec_())
├── main.py
├── neulabel.py
└── testpromote.ui
...