PythonSIP不转换自定义类型的信号参数

2024-10-01 15:49:45 发布

您现在位置:Python中文网/ 问答频道 /正文

背景

在与PyQt没有什么不同的样式中,SIP用于为基于Qt(Source)的自定义库生成本机绑定。我正在尝试诊断一个与信号有关的问题,这些信号为传递到各自插槽时未转换的自定义类型提供参数,并且正在寻找指针以供尝试。代码是开源的,我鼓励任何人自己尝试一下代码,但是对于那些想要更简洁/精炼的描述的人,我在这里做了最好的尝试。你知道吗

问题

让我们从Python代码开始,该代码使用产生问题的模块(Interactions Example)。这是主窗口构造函数中的标准信号/插槽连接代码,完整的源代码可以在主窗口.py. 你知道吗

class MainWindow(QMainWindow):

    def __init__(self, argv, parent=None):
        # ... snipped other setup code ...

        # connect slot that shows a message in the status bar when a graph is clicked:
        self.customPlot.plottableClick.connect(self.graphClicked)

QCustomPlot和plottableClick信号的定义在sip中/核心.sip. 请注意,plottableClick信号提供一个QCPAbstractPlottable*对象作为第一个参数。你知道吗

class QCustomPlot : public QWidget
{

    // ... snipped other methods of QCustomPlot type ...

signals:
  void plottableClick(QCPAbstractPlottable *plottable, int dataIndex, QMouseEvent *event);

现在让我们看看slot方法,这是可以观察到问题的地方。调用插槽时,会引发异常,因为plottable是有效的PyObject,但它没有类型成员,从而导致对interface1D的调用失败:

def graphClicked(self, plottable, dataIndex):
    dataValue = plottable.interface1D().dataMainValue(dataIndex) # fails because plottable has no member method called "interface1D"

QCPAbstractPlottable的绑定显示成员已定义。你知道吗

class QCPAbstractPlottable : public QCPLayerable /Abstract/
{

  // ... snipped other methods here ...

  virtual QCPPlottableInterface1D *interface1D();

另外,在调用QCustomPlot的成员函数时,生成的绑定不会正确地转换类型,例如QCustomPlot.selectedPlottables打印表()返回一个QList。这使我相信问题是特定于信号的。你知道吗

问题

几天来,我一直在思考这个问题,现在看来SIP似乎没有必要的信息来识别库中定义的类型,这些类型在传递到信号时可以转换。你知道吗

查看PyQt5源代码,我发现了库中定义的类型作为信号参数传递的示例,例如QWidget::mousePressEvent接受QMouseEvent*,这与我尝试在自己的信号中复制的模式相同。但是,我找不到任何特殊的SIP粘合代码来提示代码生成器如何转换类型。你知道吗

我做错了什么?你知道吗


Tags: 代码self类型定义信号class插槽other
1条回答
网友
1楼 · 发布于 2024-10-01 15:49:45

结果证明答案很简单,诀窍是使用%ConvertToSubClassCode指令。在这里,您可以使用任何形式的rtti(可能是qobject\u cast、dynamic\u cast或任何其他机制)手工编写逻辑代码,从对象中推断类型,然后将sipType变量设置为正确的值(有关更详细的解释,请参阅链接文档)。你知道吗

相关问题 更多 >

    热门问题