How to pass variables to slot methods in QT?

后端 未结 6 1327
长情又很酷
长情又很酷 2021-02-14 04:19

I\'m making a little chat messenger program, which needs a list of chat channels the user has joined. To represent this list graphically, I have made a list of QPushButton

相关标签:
6条回答
  • 2021-02-14 04:54

    Use QSignalMapper to pass variables;

            QSignalMapper* signalMapper = new QSignalMapper (this) ;
            QPushButton *button = new QPushButton();
    
    
             signalMapper -> setMapping (button, <data>) ;
             connect (signalMapper, SIGNAL(mapped(QString)), this,   
                       SLOT(buttonClicked(QString))) ;
    

    in slot i.e

    void class::buttonClicked(QString data){
    
        //use data
        // to get sender 
        QSignalMapper *temp = (QSignalMapper *)this->sender();
        QPushButton *btn = (QPushButton *)temp->mapping(data);
        // use btn
    
    }
    

    Hope my ans may help you

    0 讨论(0)
  • 2021-02-14 05:05

    Don't use the sender method unless you absolutely have to. It ties the function directly to being used only as a slot (can't be called directly). Retain the behavior of having the function accept a string and simply make a mechanism by which you can call it.

    One method, among others you might find, is to leverage use of QSignalMapper. It will map objects to values and regenerate signals of the appropriate signature.

    0 讨论(0)
  • 2021-02-14 05:06

    You could try having your switchTab slot take no argument and use QObject::sender to get the object that sent the signal.

    Messenger::switchTab()
    {
      QObject* sender = this->sender();
      QPushButton* button = qobject_cast<QPushButton*>(sender);
      if(button)
      {
        // Do stuff...
      }
    }
    
    0 讨论(0)
  • 2021-02-14 05:07

    I would do it with "relay" objects:

    Create TabSwitchRelay which is a sub-class of QObject with this constructor:

    TabSwitchRelay::TabSwitchRelay(QObject *parent, Messanger * m, const QString & c)
    : QObject(parent), m_messanger(m), m_channel(c)
    {
    }
    

    It also has a slot clicked():

    void TabSwitchRelay::clicked()
    {
        m_messager->switchTab(m_channel);
    }
    

    Now replace the line in your code that does connect with this:

    TabSwitchRelay * tabRelay = new TabSwitchRelay(pushButton, this, channel);
    connect(pushButton, SIGNAL(clicked()), tabRelay, SLOT(clicked()));
    

    It's not tested but you get teh basic idea.

    0 讨论(0)
  • 2021-02-14 05:16

    if you're using Qt5, you can do it through lambda:

    connect( sender, &Sender::valueChanged,  [=](){ myMethod(5); } );
    
    void myMethod(int value)
    {
      // do stuff
    }
    
    0 讨论(0)
  • 2021-02-14 05:21

    For strings and integers, you can use QSignalMapper. In your Messenger class, you would add a QSignalMapper mapper object, and your function would look like:

    void Messenger::addToActivePanels(std::string& channel)
    {
        activePanelsContents = this->findChild<QWidget *>(QString("activePanelsContents"));
        pushButton = new QPushButton(activePanelsContents);
        // ...
        connect(pushButton, SIGNAL(clicked()), &mapper, SLOT(map()));
        mapper.setMapping(pushButton, QString(channel.c_str()));
    }
    

    and after you have added all channels to your active panels, you call

    connect(&mapper, SIGNAL(mapped(const QString &)), this, SLOT(switchTab(const QString &)));
    
    0 讨论(0)
提交回复
热议问题