2015-05-22 2 views
0

Я пытаюсь преобразовать пользовательский виджет Qt4, написанный на C++, в пользовательский виджет Python 2.7. Тем не менее, мне не удалось выяснить, как QLabel(parent) будет написан на Python. Это оригинальный C++ код из файла «.ccp»:Класс Port C++ для PyQt

DocumentWidget::DocumentWidget(QWidget *parent) 
    : QLabel(parent) 
{ 
    currentPage = -1; 
    setAlignment(Qt::AlignCenter); 
} 

QLabel(parent), кажется, какой-то список инициализатора. Я попытался использовать множественное наследование в Python параллельно, но это приводит к следующей ошибке: Cannot create a consistent method resolution order (MRO) for bases QLabel, QWidget.

Я пытаюсь перенести код вместо создания оболочки для виджета C++, потому что я не знаю C++ и думаю, что мне придется настраивать виджет дальше в будущем.

Я не тренировался как программист, и это первый день, когда я столкнулся с C++, поэтому не стесняйтесь исправлять меня, даже если я делаю что-то глупое. Я не смущусь.

+0

Это обозначение для вызова конструктора базового класса ([как это] (https://stackoverflow.com/questions/10282787/calling-the-base-class-constructor- in-the-production-class-constructor)), поэтому он будет эквивалентен [вызову 'super. __init__'] (https://stackoverflow.com/questions/576169/understanding-python-super-with-init-methods) – CoryKramer

+0

Да, это выглядит правильно. – CoryKramer

ответ

2

Код определяет конструктор класса DocumentWidget, который наследует QLabel и требует в качестве родителя QWidget.

Эквивалентный код PyQt будет:

from PyQt4 import QtCore, QtGui 

class DocumentWidget(QtGui.QLabel): 
    def __init__(self, parent): 
     super(DocumentWidget, self).__init__(parent) 
     # or QtGui.QLabel.__init__(self, parent) 
     self.currentPage = -1 
     self.setAlignment(QtCore.Qt.AlignCenter) 
+0

Обычно 'parent' является необязательным, поэтому он должен быть чем-то вроде' def __init __ (self, parent = None) '. –

+0

@PavelStrakhov. Да, конечно, но тогда это не будет строго эквивалентно (т. Е. Подпись C++ не 'QWidget * parent = 0'). Могут быть веские причины, по которым в настоящее время они не являются необязательными (возможно, некоторые методы требуют доступа к родительскому элементу). Но в любом случае, я думаю, что первый этап кода переноса всегда должен быть очень консервативным и стремиться быть чисто синтаксическим. Это значительно облегчает определение регрессий путем тестирования версии python непосредственно на оригинале C++. Изменения дизайна могут появиться позже. – ekhumoro

+0

С помощью этого подхода, как вы передаете QWidget как родителя? Когда я вызываю 'DocumentWidget (QWidget)' I get', аргумент 1 имеет неожиданный тип 'PyQt4.QtCore.pyqtWrapperType'' –

0

Множественное наследование работало, но базовые классы должны были называться в правильном порядке (то есть, DocumentWidget(QLabel, QWidget) вместо DocumentWidget(QLabel, QWidget)).

В полном объеме:

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class DocumentWidget(QLabel, QWidget): 
    def __init__(self, parent=None): 
     super(DocumentWidget, self).__init__() 
     self.currentPage = -1 
     self.setAlignment(Qt.AlignCenter) 
+0

Этот код является неправильным, и только «работает», потому что 'QLabel' является подклассом' QWidget'. Qt почти исключительно использует * single * inheritance, поэтому вы никогда не должны пытаться использовать множественное наследование в PyQt. В большинстве случаев это приведет к ошибке. В этом случае просто избыточно также наследовать «QWidget», поэтому вы должны просто удалить его. Кроме того, вы должны выполнить '__init __ (parent)' с вызовом 'super', иначе это не будет иметь никакого эффекта. Все в порядке, чтобы передать «Нет» (это значение по умолчанию), потому что «QLabel» необязательно требует родителя. – ekhumoro