2017-08-24 5 views
0

J'ai créé un QPushButton dans la dernière colonne de tableview (qui contient l'adresse IP des clients connectés à mon application). Avec ce bouton, je suis capable de déconnecter le client connecté dans cette rangée en utilisant le signal de libération de bouton et le slot 'handlebutton (int)'.Mise à jour du mappage lors de l'utilisation de QSignalMapper

Le code est -

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); 
} 

Maintenant, je veux mettre à jour la cartographie. Où dois-je faire cela dans la fente ou ailleurs? S'il vous plaît, si quelqu'un peut me suggérer comment et où le faire?

Merci d'avance!

Répondre

0

Si je comprends bien, vous voulez juste démapper un bouton dès qu'il a été cliqué et que le client correspondant a été déconnecté. Ensuite, vous pouvez simplement appeler mapper->removeMapping(button) sur le bouton approprié. Si vous avez besoin de mapper ce bouton à nouveau, appelez à nouveau mapper->setMapping(button, i). Gardez à l'esprit, il ne se déconnecte pas le bouton released signal du mappeur. Si vous en avez besoin, utilisez explicitement QObject::disconnect.

Aussi si votre bouton est détruit - les deux removeMapping et disconnect sont faits pour vous, donc vous n'avez pas à vous en préoccuper.

+0

Merci pour cette réponse rapide. J'ai utilisé mapper-> setMapping (bouton, i) dans la boucle, mais cela ne semble pas fonctionner. Pouvez-vous dire où dois-je le placer? – tanmayb

+0

@tanmayb, c'est déjà une question différente. [Voici un exemple] (http://doc.qt.io/qt-5/qsignalmapper.html) comment utiliser 'setMapping (bouton, ...)' dans une boucle. Fais juste la même chose. Si cela ne fonctionne pas bien, je recommande de commencer par cartographier un seul bouton, puis d'ajouter une boucle pour en mapper quelques autres. De plus, à des fins de débogage, vous pouvez créer un slot 'handleButton' pour afficher un message simple sur la console. Et la dernière chose que je recommanderais, est d'utiliser la [syntaxe Qt 5] (http://doc.qt.io/qt-5/signalsandslots.html) pour les connexions de signaux et de slots. – WindyFields