2017-08-24 74 views
0

我在tableview的最後一列(包含連接到我的應用程序的客戶端的IP地址)中創建了一個QPushButton。使用該按鈕,我可以使用按鈕釋放信號和插槽'handlebutton(int)'斷開與該特定行中連接的客戶端的連接。使用QSignalMapper時更新映射

的代碼 -

MainWindow::MainWindow(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    QSortFilterProxyModel *model = new QSortFilterProxyModel(this); 
    model = pCApp->guiClient()->getConnectionManagement()->getProxyModel(); 
    ui->tableView->setModel(model); 
    QPushButton *button; 
    QSignalMapper *mapper = new QSignalMapper(this); 
    QObject::connect(mapper, SIGNAL (mapped(int)), this, SLOT (handleButton(int))); 
    for (int i = 0; i < model->rowCount(); i++) 
    { 
     button = new QPushButton; 
     button->setText("Disconnect " + QString::number(i)); 
     button->setStyleSheet("QPushButton { color: #E5E5E5; }"); 
     ui->tableView->setIndexWidget(model->index(i,2, QModelIndex()), button); 
     QObject::connect(button, SIGNAL(released()), mapper, SLOT(map())); 
     mapper->setMapping(button, i); 
    } 
    setAttribute(Qt::WA_DeleteOnClose); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::handleButton(int row) 
{ 
    CGuiClientMessage message; 
    message.setRecipient(CGuiMessage::R_GUISERVER); 
    message.setObjectId(0); 
    message.setCommand(CGuiMessage::DISCONNECT_PEER); 
    message.Parameter().setAttribute("Peers", ui->tableView->model()->data(ui->tableView->model()->index(row,1)).toString()); 
    pCApp->guiClient()->SendMessageToPts(message); 
} 

現在,我想更新的映射。我應該在狹槽或其他地方做什麼?請,如果任何人可以建議我如何以及在哪裏做?

提前致謝!

回答

0

如果我說得對,只要點擊一個按鈕就取消映​​射按鈕,並且相應的客戶端已斷開連接。然後,您可以在相應的按鈕上撥打mapper->removeMapping(button)。如果您需要再次映射此按鈕 - 請再次撥打mapper->setMapping(button, i)

請記住,它不會中斷映射器的按鈕released信號。如果你需要 - 明確使用QObject::disconnect

此外,如果您的按鈕被破壞 - removeMappingdisconnect都爲您完成,因此您不必擔心這一點。

+0

感謝您的快速回復。我在循環中使用了mapper-> setMapping(button,i),但它似乎不起作用。你能告訴我應該把它放在哪裏嗎? – tanmayb

+0

@tanmayb,這已經是一個不同的問題。 [這裏是一個例子](http://doc.qt.io/qt-5/qsignalmapper.html)如何在循環中使用'setMapping(button,...)'。只要做同樣的事情。如果效果不好,我建議先從一個按鈕開始映射,然後再添加一個循環來映射更多。另外,爲了調試目的,你可以使'handleButton'插槽向控制檯輸出一個簡單的消息。我推薦的最後一件事就是使用[Qt 5語法](http://doc.qt.io/qt-5/signalsandslots.html)進行信號和插槽連接。 – WindyFields