Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Проблема с QAction


Автор: Lindemann66 15.8.2011, 15:59
Всем привет!

Есть иконка в трее
У неё есть меню
Код

    m_ptrayIconMenu = new QMenu(this);

Динамически создаём 2 итема
Код

    QAction* act1 = new QAction("Analyze 1 page", this);
    connect(act1, SIGNAL(triggered()),
            this, SLOT(analyze())
            );

    QAction* act2 = new QAction("Analyze 2 page", this);
    connect(act2, SIGNAL(triggered()),
            this, SLOT(analyze())
            );


Такая задача
По нажатию на act1 вызывать одно действие, а по act2 - другое

Конечно, так сделать не выйдет
Тогда нужно вызывать одно и то же действие, но С ПАРАМЕТРОМ:
Код

    QAction* act1 = new QAction("Analyze 1 page", this);
    connect(act1, SIGNAL(triggered()),
            this, SLOT(analyze("page1"))
            );

    QAction* act2 = new QAction("Analyze 2 page", this);
    connect(act2, SIGNAL(triggered()),
            this, SLOT(analyze("page2"))
            );


Но увы, так тоже нельзя!

Так как же быть?
Ещё раз обращу внимание, что меню должно вызываться динамически, => количество и сами элементы ЗАРАНЕЕ неизвестны

Автор: borisbn 15.8.2011, 19:45
Код

    QAction* act1 = new QAction("Analyze 1 page", this);
    act1->setData( QVariant( 1 ) );
    connect(act1, SIGNAL(triggered()), this, SLOT(analyze()) );

    QAction* act2 = new QAction("Analyze 2 page", this);
    act1->setData( QVariant( 2 ) );
    connect(act2, SIGNAL(triggered()), this, SLOT(analyze()) );
...

void MyClass::analyze() {
    QAction * act = dynamic_cast<QAction *> sender();
    if ( act != 0 ) {
        analize( act->data().toInt() );
    }
}

void MyClass::analyze( int pageIdx ) {
    switch ( pageIdx ) {
    // ну, дальше сам :)
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)