2017-08-24 73 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