python - 将 C++ 行转换为 Python 3

标签 python c++ python-3.x qt pyqt5

<分区>

我正在尝试将一个 Qt 插件从 C++ 翻译成 Python,但是我对 C++ 的了解很少,你能帮我确认我的翻译是否正确吗? (插件未按预期工作)。

C++代码:

/***************************************************************************
 *   Copyright (C) 2006-2008 by Tomasz Ziobrowski                          *
 *   http://www.3electrons.com                                             *
 *   e-mail: t.ziobrowski@3electrons.com                                   *
 *                                                                         *
 *                                                                         *
 *   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")

我的疑问具体在 C++ 代码的第 69 行,它说:

m_svg = new QSvgRenderer(this);

我不知道怎么翻译这个,那个"new"让我觉得我做错了,检查我的翻译:

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>

最佳答案

我发现问题出在以下行中:

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

%1 被QString用来完成数据,如果是python,使用format时必须使用{}:

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

在下面link你可以找到完整的代码。

关于python - 将 C++ 行转换为 Python 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51199137/

相关文章:

python - PyQt5 可将图标从 ListView 拖动到另一个 ListView

c++ - 使用 png++ 编写 png 图像

python - 如何将 unittest 子测试转换为 pytest

python - 查找标识符的等效字符串(如源代码中所示)?

python - 无法在 GAE 的 python 中导入正确的模块

python - Kafka python消费者组 session 超时

c++ - 'if' 表达式后续变量声明

c++ - CRect 和 CRect* 如何成为 GetClientRect 的输入参数?

python - 如何在 Python OOP 中打印 "instantiated"变量?

python - 计算 dask 数据框中 2 个日期时间列之间的天数