Перевод строки C ++ в Python 3

Я пытаюсь перевести плагин Qt с C ++ на python, однако мои знания по C ++ минимальны, не могли бы вы помочь мне подтвердить, если мой перевод в порядке? (плагин не работает должным образом).

Код C ++:

/***************************************************************************
*   Copyright (C) 2006-2008 by Tomasz Ziobrowski                          *
*   http://www.3electrons.com                                             *
*   e-mail: [email protected]                                   *
*                                                                         *
*                                                                         *
*   This program is free software; you can redistribute it and/or modify  *
*   it under the terms of the GNU General Public License as published by  *
*   the Free Software Foundation; either version 2 of the License, or     *
*   (at your option) any later version.                                   *
*                                                                         *
*   This program is distributed in the hope that it will be useful,       *
*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
*   GNU General Public License for more details.                          *
*                                                                         *
*   You should have received a copy of the GNU General Public License     *
*   along with this program; if not, write to the                         *
*   Free Software Foundation, Inc.,                                       *
*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
***************************************************************************/

#include <QPainter>
#include <QPen>
#include <QSvgRenderer>
#include "counter.h"

Counter::Counter (QWidget * parent):QWidget(parent)
{
init();
}

int Counter::digits() const
{
return m_digits;
}

int Counter::value() const
{
return m_value;
}

const QString Counter::digitsFile() const
{
return m_digitsFile;
}

/*--------------------------------------------------------------------------------------------
P U B L I C   S L O T S
--------------------------------------------------------------------------------------------*/
void Counter::setValue(int i)
{
m_value = i;
update();
}

void Counter::setDigits(int i)
{
m_digits = i;
update();
}

void Counter::setDigitsFile(const QString & i )
{
m_digitsFile = i;
if (m_svg)
delete m_svg;
m_svg = new QSvgRenderer(this);
if (!m_svg->load(m_digitsFile))
{
qDebug("Counter::setDigitsFile can't load file %s",qPrintable(m_digitsFile));
m_digitsFile = ":/default/resources/train_digits.svg";
m_svg->load(m_digitsFile);

}
else
qDebug("Counter::setDigitsFile %s loaded",qPrintable(m_digitsFile));

update();
}

/*--------------------------------------------------------------------------------------------
P R O T E C T E D
--------------------------------------------------------------------------------------------*/
#define X_OFFSET 10
#define Y_OFFSET 10

void Counter::paintEvent (QPaintEvent *)
{
QPainter p(this);
p.setRenderHint(QPainter::Antialiasing,true);

p.save();
int side = this->height();
p.scale(side/100.0,side/100.0);

double width = 100.0 * this->width()/this->height(), height = 100.0;//p.setPen(Qt::NoPen);
QPen pen = p.pen();

pen.setColor(QColor(32,32,32));
pen.setWidthF(6.0);
p.setPen(pen);
p.setBrush(Qt::black);
p.drawRoundRect(3,3,width-6,height-6,7,(7*width)/(double)height);int w = (width-2*X_OFFSET)/m_digits;
int x = (m_digits-1) * w;
int h = height-2*Y_OFFSET;
int r, c = m_value;

for (int i=0 ; i<m_digits ; i++)
{
r = c % 10;
c = c/10;
QRect rect(x+X_OFFSET,Y_OFFSET,w,h);
m_svg->render(&p,QString("d%1").arg(r),rect);
x -= w;
}
p.restore();
}void Counter::init()
{
Q_INIT_RESOURCE(analogwidgets);
m_digits = 4;
m_value = 0;
m_svg = NULL;
setDigitsFile(":/default/resources/train_digits.svg");
}

Мой перевод на Python:

from PyQt5.QtGui import QPainter, QPen, QColor
from PyQt5.QtSvg import QSvgRenderer
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QWidget
import sys
import os

class PyCounter(QWidget):
def __init__(self, parent = None):
super(PyCounter, self).__init__(parent)

self.inicio()

def getDigits(self):
return self.m_digits

def getValue(self):
return self.m_value

def getDigitsfile(self):
return self.m_digitsFile

def setValue(self, val):
self.m_value = val
self.update()

def setDigits(self, dit):
self.m_digits = dit
self.update()

def setDigitsFile(self, filemon):
self.m_digitsFile = filemon
if self.m_svg == True:
del self.m_svg
self.m_svg = QSvgRenderer(self)
if self.m_svg.load(self.m_digitsFile) == False:
print("Cannot load resource File")
self.m_digitsFile = ":/default/resources/train_digits.svg"self.m_svg.load(self.m_digitsFile)
else:
print("Train digits correctly loaded")
self.update()

X_OFFSET = 10
Y_OFFSET = 10

def paintEvent(self, event):
p = QPainter(self)
p.setRenderHint(QPainter.Antialiasing)
p.save()

side = self.height()
p.scale(side/100.0, side/100.0)
width = 100 * self.width()
height = 100 * self.height()

pen = QPen(p.pen())

pen.setColor(QColor(32,32,32))
pen.setWidthF(6.0)
p.setPen(pen)
p.setBrush(Qt.black)
p.drawRoundedRect(3,3,width-6,height-6,7,(7*width)/height)

w = (width - 2*(10))/self.m_digits
x = (self.m_digits-1) * w
h = height-2*10
c = self.m_value
r = 0

y = 0
while y < self.m_digits:
y += 1
r = c % 10
c = c/10
rect = QRectF(x + 10, 10, w, h)
self.m_svg.render(p, str("d%1").format(r), rect)
x -= w

p.restore()

def inicio(self):
import AnalogWidgets_rc
self.m_value = 0
self.m_digits = 4
self.m_svg = None
self.setDigitsFile(":/default/resources/train_digits.svg")

Мои сомнения касаются именно строки 69 кода C ++, где говорится:

m_svg = new QSvgRenderer(this);

Я не знаю, как именно это перевести, это «новое» заставляет меня чувствовать, что я делаю это неправильно, проверьте мой перевод:

self.m_svg = QSvgRenderer(self)

Что не работает должным образом, так это загрузка SVG.

РЕДАКТИРОВАТЬ:

Вот как выглядят виджеты:

PyCounter

AnalogWidgets_rc.py:

https://pastebin.com/Ck0VX6eG

Этот файл был создан с помощью инструмента pyrcc5

Оригинал analogwidgets.qrc:

<RCC>
<qresource prefix="/default" >
<file>resources/train_digits.svg</file>
<file>resources/dial1.svg</file>
<file>resources/dial2.svg</file>
<file>resources/dial3.svg</file>
<file>resources/dial4.svg</file>
</qresource>
</RCC>

1

Решение

Я вижу, что проблема в следующей строке:

self.m_svg.render(p, str("d%1").format(r), rect)

%1 используется QString для завершения данных, в случае с python при использовании формата вы должны использовать {}:

self.m_svg.render(p, "d{}".format(r), rect)

В следующих ссылка на сайт Вы можете найти полный код.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]