Я пытаюсь перевести плагин 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.
РЕДАКТИРОВАТЬ:
Вот как выглядят виджеты:
AnalogWidgets_rc.py:
Этот файл был создан с помощью инструмента 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>
Я вижу, что проблема в следующей строке:
self.m_svg.render(p, str("d%1").format(r), rect)
%1
используется QString для завершения данных, в случае с python при использовании формата вы должны использовать {}
:
self.m_svg.render(p, "d{}".format(r), rect)
В следующих ссылка на сайт Вы можете найти полный код.
Других решений пока нет …