[英]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()
信號連接到QSignalMapper
的map()
插槽,並使用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)
。
您可以分配QString
, QWidget*
或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.