簡體   English   中英

QSignalMapper如何工作?

[英]How does QSignalMapper work?

我在這里發布后:將信號和插槽關聯到qcheckbox動態創建我需要關聯:

•當我點擊qCheckBox到我的函數cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)clicked()信號

要做到這一點,我必須使用QSignalMapper ,經過兩個小時試圖了解它是如何工作的,我不能有一個好的結果,這是我做的代碼,這顯然是錯誤的:

 QSignalMapper *m_sigmapper = new QSignalMapper(this);
 QObject::connect(pCheckBox, SIGNAL(mapped(QTableWidget*,int, QCheckBox*)), pCheckBox, SIGNAL(clicked()));
 QObject::connect(this, SIGNAL(clicked()), this, SLOT(cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)));

 m_sigmapper->setMapping(pCheckBox, (monTab,ligne, pCheckBox));
 QObject::connect(m_sigmapper, SIGNAL(clicked()),this, SLOT(cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)));

你能解釋一下QSignalMapper工作原理嗎? 我真的不明白要聯系到什么:(

QSignalMapper類收集一組無參數信號,並使用與發送信號的對象相對應的整數,字符串或窗口小部件參數重新發出它們。 所以你可以有一個像:

QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(QWidget *)),this,SLOT(mySlot(QWidget *)));

對於每個按鈕,您可以將clicked()信號連接到QSignalMappermap()插槽,並使用setMapping添加映射,以便當從按鈕發出clicked()信號時,將發出信號mapped(QWidget *)

QPushButton * but = new QPushButton(this);

QObject::connect(but, SIGNAL(clicked()),mapper,SLOT(map()));
mapper->setMapping(but, but);

這樣,無論何時單擊按鈕,都會發出映射器的mapped(QWidget *)信號,其中包含窗口小部件作為參數。

首先,我將向您解釋QSignalMapper工作原理。 然后我會解釋你為什么不需要它。

QSignalMapper工作原理:

創建s QSignalMapper 讓我們假設您要為每個復選框分配一個整數值,因此每次單擊任何復選框時,您將獲得一個分配了整數值的信號。

將映射器信號連接到SLOT,您將實現:

connect(mapper, SIGNAL(mapped(int)), this, SLOT(yourSlot(int)));

現在你可以寫槽,這將采用整數參數。 您擁有的每個復選框的參數都不同。

在創建復選框時,您需要執行以下每個復選框:

mapper->setMapping(checkBox, integerValueForThisCheckbox);
connect(checkBox, SIGNAL(clicked()), mapper, SLOT(map()));

從現在開始,每次單擊復選框時,它都會向QSignalMapper發出clicked()信號,然后將其映射到指定的整數值並發出mapped()信號。 您連接到該mapped()信號,因此將使用正確的整數值調用yourSlot(int)

您可以分配QStringQWidget*QObject* (而不是整數)(參見Qt文檔)。

這就是QSignalMapper工作原理。

你不需要它:

  • QTableWidget *monTab是單個對象,它不會改變。 將其保留為類成員字段,並從插槽功能中使用它。
  • QCheckBox *pCheckBox - 您可以通過將sender()QCheckBox*來獲取它。

像這樣:

void supervision::yourSlot()
{
    QCheckBox* pCheckBox = qobject_cast<QCheckBox*>(sender());
    if (!pCheckBox) // this is just a safety check
        return;
}

sender()函數來自您繼承的QObject ,因此您可以訪問它。

  • int linge (它是一個行號,對嗎?) - 當你創建復選框時,你可以存儲指向QList類字段中的復選框的指針,並從你的插槽函數中使用它找出它是哪一行,如下所示:

在課堂申報中:

private:
    QList<QCheckBox*> checkboxes;

創建復選框時:

QCheckBox* cb = new QCheckBox();
checkboxes << cb;

在你的插槽功能:

void supervision::yourSlot()
{
    QCheckBox* pCheckBox = qobject_cast<QCheckBox*>(sender());
    if (!pCheckBox) // this is just a safety check
        return;

    int linge = checkboxes.indexOf(pCheckBox);
}

如果需要,可以跳過該QList並使用QSignalMapper並使用mapper將行分配給復選框。 這只是你喜歡的問題。

暫無
暫無

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

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