簡體   English   中英

如何確定誰發出了信號?

[英]How to determine who emitted the signal?

我在 PyQt 上開發了一個應用程序,我喜歡信號槽模型,但是有什么方法可以確定信號的發射器嗎? 我希望有一種方法,因為它可以讓我們編寫更通用的代碼,而無需為每個類似的信號定義大量插槽。

我覺得我開題太早了,因為我自己在google上找到了答案。 當插槽被發射器激活時,發射器的指針被存儲,可以通過

QObject::sender()

因此可以通過以下方式在 PyQt 中訪問:

@QtCore.pyqtSlot()
def someSlot(self):
    self.sender()

您可能需要查看QSignalMapper類,因為它提供了一種將 int、字符串或小部件參數與發送給定信號的對象相關聯的方法。 主要限制是被映射的信號/時隙需要是無參數的。

QT4.7 文檔中的C++ 示例:

 ButtonWidget::ButtonWidget(QStringList texts, QWidget *parent)
     : QWidget(parent)
 {
     signalMapper = new QSignalMapper(this);

     QGridLayout *gridLayout = new QGridLayout;
     for (int i = 0; i < texts.size(); ++i) {
         QPushButton *button = new QPushButton(texts[i]);
         connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
         signalMapper->setMapping(button, texts[i]);
         gridLayout->addWidget(button, i / 3, i % 3);
     }

     connect(signalMapper, SIGNAL(mapped(const QString &)),
             this, SIGNAL(clicked(const QString &)));

     setLayout(gridLayout);
 }

您可以在此處找到 PyQT4 示例,但是當我有機會時,我會嘗試添加一個簡單的 PyQT4 示例。

Qt5 選項是使用信號映射器。 它是一個能夠接收來自不同來源的信號並使用唯一參數調用單個回調函數(槽)的對象。 然后該函數使用該參數來確定源。 假設我們要將兩個復選框連接到同一個插槽:

創建信號映射器:

signalMapper = QSignalMapper()

int類型的映射與回調函數關聯:

signalMapper.mapped[int].connect(sync_checkboxes)

將觸發信號的小部件連接到映射器:

checkbox_1.clicked.connect(signalMapper.map)
checkbox_2.clicked.connect(signalMapper.map)

定義源和 int 值(0 和 1)之間的映射:

signalMapper.setMapping(checkbox_1, 0)
signalMapper.setMapping(checkbox_2, 1)

現在回調接受整數值:

def sync_checkboxes(index):
    if index == 0:
        ....

文件(質量差):

映射可以是空的(傳遞源對象引用)、基於整數、基於字符串或基於對象。 根據我從文檔中的理解,不同類型可以混合使用,映射器識別哪個映射與源相關聯,並調用適當的回調。 如果為同一個源設置了多個映射會發生什么情況沒有說,因此需要進行一些實驗。 遺憾的是,文檔對於如此有趣的產品來說如此糟糕。

請注意,這不會告訴您例如。 編輯了網格控件中的哪個單元格 - 只是網格控件句柄本身。

有一本新的高級 Qt 書,其中詳細介紹了高級信號/插槽路由

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM