Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Regarding QTabWidget and QSignalMapper



  • hello all, i want to fire a command which is a QString when a particular tab is selected using QSignalMapper depending on the tab_index i have selected.
    @
    connect(tab_widget, SIGNAL(currentChanged(int)), signal_mapper, SLOT(map()));
    @
    This doesn't work for me as map() slot don't take any arguments.
    Please help me with the same or show me other way round to do this stuff.



  • QSignapMapper is not the class you are looking for. QTabWidget already has a signal that contains an index for the selected tab. You can use that to make a mapping to a string yourself. Simply use a QStringList to store the strings, and lookup the corresponding string for each index, and then re-emit the signal with the string.



  • thanks andre for your suggestion but i want to make it work according to my design::-
    i want to store the strings as a property for each child widgets of QTabWidget by using setProperty() in a function set_command() where i pass qtabwidget, index of tab, string as an argument.
    So that when currentChanged() signal is emitted, it inquires the property of its current active widget and fires command.
    Also i dont want to store the strings as member variable in QStringList.
    Please do suggest, how to use signal slot in this case.



  • That was not the design you described in your first post, but ok. It is still simple. You can indeed also store the strings as a property in the tab widgets themselves. I think I would do something like this:

    @
    //header

    class MyTabWidget: public QTabWidget {
    Q_OBJECT

    public:
    MyTabWidget(QWidget* parent=0);

    signals:
    void currentChanged(QString);

    private slots:
    void onCurrentChanged(int index);
    }

    // implementation
    MyTabWidget::MyTabWidget(QWidget* parent):
    QTabWidget(parent)
    {
    connect(this, SIGNAL(currentChanged(int)), this, SLOT(onCurrentChanged(int)));
    }

    void MyTabWidget::onCurrentChanged(int index)
    {
    QWidget* w = widget(index);
    if (w) {
    QString s = w->property("theStringProperty").toString();
    if (!s.isEmpty()) emit currentChanged(s);
    }
    }
    @

    This should (not tested, brain to forum) emit a currentChanged(QString) signal if they have a QString property theStringProperty set.



  • thanks Andre, it really helped me.
    sorry for not posting details previous only.


Log in to reply