Russian Qt Forum

Программирование => С/C++ => Тема начата: Alexorleon от Июль 31, 2013, 06:56



Название: [РЕШЕНО] Динамическое назначение горячих клавиш
Отправлено: Alexorleon от Июль 31, 2013, 06:56
Здравствуйте, помогите разобраться в сложившейся ситуации.

В QSettings  сохраняю настройки горячих клавиш. Сохранение работает как надо. Но горячие клавиши назначаются только после перезапуска программы.

Происходит все так:
Запускаю программу, открываю редактор горячих клавиш, редактирую, нажимаю применить и тут по смыслу кода новые клавиши прилетают в GetListKeys, сохраняются и затем в setHotKeys должны задаться новые значения клавиш. Но этого не происходит, работают старые комбинации. А если перезапустить программу, то все работает.

Подскажите пожалуйста что я не так сделал? Как правильно динамически задать горячую клавишу.

Вот код:
Код:
RCommonObject::RCommonObject(bool upkey, QWidget *parent) :
    QWidget(parent)
{
    upkeyBool = upkey;
    settingsKeys = new QSettings("klabis", "reception", this);
    // загружаем настройки клавиш
    loadSettings();

    inclubAction = new QAction(parent);
    inclubAction->setIcon(QIcon::fromTheme("dialog-ok"));
    inclubAction->setShortcut(upkey?QKeySequence(listKeys.at(0).at(1)):QKeySequence(listKeys.at(0).at(0)));
    inclubAction->setText("Приход "+inclubAction->shortcut().toString());
    connect(inclubAction,SIGNAL(triggered()),this,SIGNAL(signal_inclub()));
    p_actions << inclubAction;
    inclubAction->setDisabled(true);

    outclubAction = new QAction(parent);
    outclubAction->setIcon(QIcon::fromTheme("dialog-cancel"));
    outclubAction->setShortcut(upkey?QKeySequence(listKeys.at(1).at(1)):QKeySequence(listKeys.at(1).at(0)));
    outclubAction->setText("Уход "+outclubAction->shortcut().toString());
    connect(outclubAction,SIGNAL(triggered()),this,SIGNAL(signal_outclub()));
    p_actions << outclubAction;
    outclubAction->setDisabled(true);

    checkAction = new QAction(parent);
    checkAction->setIcon(QIcon(":/img/check.png"));
    checkAction->setShortcut(upkey?QKeySequence(listKeys.at(2).at(1)):QKeySequence(listKeys.at(2).at(0)));
    checkAction->setText("Чек "+checkAction->shortcut().toString());
    connect(checkAction,SIGNAL(triggered()),this,SLOT(showCheck()));
    p_actions << checkAction;
    checkAction->setEnabled(ECoreObject::instance()->tryAccesMode(103));

    blockAction = new QAction(parent);
    blockAction->setIcon(QIcon(":/img/block.png"));
    blockAction->setShortcut(upkey?QKeySequence(listKeys.at(3).at(1)):QKeySequence(listKeys.at(3).at(0)));
    blockAction->setText("Блоки "+blockAction->shortcut().toString());
    connect(blockAction,SIGNAL(triggered()),this,SLOT(showBlocks()));
    p_actions << blockAction;
    blockAction->setEnabled(ECoreObject::instance()->tryAccesMode(104));

    phonesAction = new QAction(parent);
    phonesAction->setIcon(QIcon::fromTheme("phone"));
    phonesAction->setShortcut(upkey?QKeySequence(listKeys.at(4).at(1)):QKeySequence(listKeys.at(4).at(0)));
    phonesAction->setText("Телефоны "+phonesAction->shortcut().toString());
    connect(phonesAction,SIGNAL(triggered()),this,SLOT(showPhones()));
    p_actions << phonesAction;
    phonesAction->setEnabled(ECoreObject::instance()->tryAccesMode(105));

    freezeAction = new QAction(parent);
    freezeAction->setIcon(QIcon(":/img/freeze.png"));
    freezeAction->setShortcut(upkey?QKeySequence(listKeys.at(6).at(1)):QKeySequence(listKeys.at(6).at(0)));
    freezeAction->setText("Заморозка "+freezeAction->shortcut().toString());
    connect(freezeAction,SIGNAL(triggered()),this,SLOT(showFreeze()));
    p_actions << freezeAction;
    freezeAction->setEnabled(ECoreObject::instance()->tryAccesMode(106));

    depositAction = new QAction(parent);
    depositAction->setIcon(QIcon(":/img/deposit.png"));
    depositAction->setShortcut(upkey?QKeySequence(listKeys.at(7).at(1)):QKeySequence(listKeys.at(7).at(0)));
    depositAction->setText("Депозит "+depositAction->shortcut().toString());
    connect(depositAction,SIGNAL(triggered()),this,SLOT(showDeposit()));
    p_actions << depositAction;
    depositAction->setEnabled(ECoreObject::instance()->tryAccesMode(107));

    mailAction = new QAction(parent);
    mailAction->setIcon(QIcon::fromTheme("mail-message"));
    mailAction->setShortcut(upkey?QKeySequence(listKeys.at(5).at(1)):QKeySequence(listKeys.at(5).at(0)));
    mailAction->setText("Сообщения "+mailAction->shortcut().toString());
    connect(mailAction,SIGNAL(triggered()),this,SLOT(showMail()));
    p_actions << mailAction;

    guestAction = new QAction(parent);
    guestAction->setIcon(QIcon(":/img/guest.png"));
    guestAction->setShortcut(upkey?QKeySequence(listKeys.at(8).at(1)):QKeySequence(listKeys.at(8).at(0)));
    guestAction->setText("Гость "+guestAction->shortcut().toString());
    connect(guestAction,SIGNAL(triggered()),this,SLOT(showGuest()));
    p_actions << guestAction;
    guestAction->setEnabled(ECoreObject::instance()->tryAccesMode(108));

    QAction *rentAction = new QAction(QIcon(":/img/rent.png"),"Аренда",parent);
    connect(rentAction,SIGNAL(triggered()),this,SLOT(showRent()));
    p_actions << rentAction;

    // --- !!!!!!!!!!!! temporary hack !!!!!!!!! ---
    if(upkey)
    {
        phonesAction->setDisabled(true);
    }
}

...
здесь ничего полезного
...

// загружаем горячие клавиши
void RCommonObject::loadSettings(){

    QStringList lst;
    // Карточка клиентов << список в клубе
    lst << "Alt+3" << "Ctrl+3";
    listKeys.append(lst);
    lst.clear();
    lst << "Alt+4" << "";
    listKeys.append(lst);
    lst.clear();
    lst << "Alt+6" << "Ctrl+6";
    listKeys.append(lst);
    lst.clear();
    lst << "Alt+8" << "";
    listKeys.append(lst);
    lst.clear();
    lst << "" << "";
    listKeys.append(lst);
    lst.clear();
    lst << "" << "";
    listKeys.append(lst);
    lst.clear();
    lst << "" << "";
    listKeys.append(lst);
    lst.clear();
    lst << "" << "";
    listKeys.append(lst);
    lst.clear();
    lst << "Alt+5" << "";
    listKeys.append(lst);
    // Чек
    lst.clear();
    lst << "";
    listKeys.append(lst);
    lst.clear();
    lst << "";
    listKeys.append(lst);
    lst.clear();
    lst << "";
    listKeys.append(lst);
    lst.clear();
    lst << "";
    listKeys.append(lst);
    lst.clear();
    lst << "";
    listKeys.append(lst);
    // Поиск
    lst.clear();
    lst << "";
    listKeys.append(lst);
    lst.clear();
    lst << "";
    listKeys.append(lst);
    lst.clear();
    lst << "";
    listKeys.append(lst);
    lst.clear();
    lst << "";
    listKeys.append(lst);

    // Карточка клиентов
    settingsKeys->beginGroup("Customer_card");
    listKeys[0][0] = settingsKeys->value("Prihod", listKeys.at(0).at(0)).toString();
    listKeys[1][0] = settingsKeys->value("Uhod", listKeys.at(1).at(0)).toString();
    listKeys[2][0] = settingsKeys->value("Chek", listKeys.at(2).at(0)).toString();
    listKeys[3][0] = settingsKeys->value("Bloks", listKeys.at(3).at(0)).toString();
    listKeys[4][0] = settingsKeys->value("Telephon", listKeys.at(4).at(0)).toString();
    listKeys[5][0] = settingsKeys->value("Message", listKeys.at(5).at(0)).toString();
    listKeys[6][0] = settingsKeys->value("Freezing", listKeys.at(6).at(0)).toString();
    listKeys[7][0] = settingsKeys->value("Deposit", listKeys.at(7).at(0)).toString();
    listKeys[8][0] = settingsKeys->value("Quest`", listKeys.at(8).at(0)).toString();
    settingsKeys->endGroup();

    qDebug()<<listKeys;
    // Cписок в клубе
    settingsKeys->beginGroup("List_club");
    listKeys[0][1] = settingsKeys->value("Prihod", listKeys.at(0).at(1)).toString();
    listKeys[1][1] = settingsKeys->value("Uhod", listKeys.at(1).at(1)).toString();
    listKeys[2][1] = settingsKeys->value("Chek", listKeys.at(2).at(1)).toString();
    listKeys[3][1] = settingsKeys->value("Bloks", listKeys.at(3).at(1)).toString();
    listKeys[4][1] = settingsKeys->value("Telephon", listKeys.at(4).at(1)).toString();
    listKeys[5][1] = settingsKeys->value("Message", listKeys.at(5).at(1)).toString();
    listKeys[6][1] = settingsKeys->value("Freezing", listKeys.at(6).at(1)).toString();
    listKeys[7][1] = settingsKeys->value("Deposit", listKeys.at(7).at(1)).toString();
    listKeys[8][1] = settingsKeys->value("Quest`", listKeys.at(8).at(1)).toString();
    settingsKeys->endGroup();
    // Чек
    settingsKeys->beginGroup("Check");
    listKeys[9][0] = settingsKeys->value("Add", listKeys.at(9).at(0)).toString();
    listKeys[10][0] = settingsKeys->value("Del", listKeys.at(10).at(0)).toString();
    listKeys[11][0] = settingsKeys->value("Save", listKeys.at(11).at(0)).toString();
    listKeys[12][0] = settingsKeys->value("Print", listKeys.at(12).at(0)).toString();
    listKeys[13][0] = settingsKeys->value("Pay", listKeys.at(13).at(0)).toString();
    settingsKeys->endGroup();
    // Поиск
    settingsKeys->beginGroup("Search");
    listKeys[14][0] = settingsKeys->value("Find", listKeys.at(14).at(0)).toString();
    listKeys[15][0] = settingsKeys->value("Clear", listKeys.at(15).at(0)).toString();
    listKeys[16][0] = settingsKeys->value("View", listKeys.at(16).at(0)).toString();
    listKeys[17][0] = settingsKeys->value("Prihod", listKeys.at(17).at(0)).toString();
    settingsKeys->endGroup();
}

// сохраняем горячие клавиши
void RCommonObject::GetListKeys(const QList<QStringList> &list){

    listKeys = list;
    settingsKeys->clear();
    // Карточка клиентов
    settingsKeys->beginGroup("Customer_card");
    settingsKeys->setValue("Prihod", listKeys.at(0).at(0));
    settingsKeys->setValue("Uhod", listKeys.at(1).at(0));
    settingsKeys->setValue("Chek", listKeys.at(2).at(0));
    settingsKeys->setValue("Bloks", listKeys.at(3).at(0));
    settingsKeys->setValue("Telephon", listKeys.at(4).at(0));
    settingsKeys->setValue("Message", listKeys.at(5).at(0));
    settingsKeys->setValue("Freezing", listKeys.at(6).at(0));
    settingsKeys->setValue("Deposit", listKeys.at(7).at(0));
    settingsKeys->setValue("Quest`", listKeys.at(8).at(0));
    settingsKeys->endGroup();
    // Cписок в клубе
    settingsKeys->beginGroup("List_club");
    settingsKeys->setValue("Prihod", listKeys.at(0).at(1));
    settingsKeys->setValue("Uhod", listKeys.at(1).at(1));
    settingsKeys->setValue("Chek", listKeys.at(2).at(1));
    settingsKeys->setValue("Bloks", listKeys.at(3).at(1));
    settingsKeys->setValue("Telephon", listKeys.at(4).at(1));
    settingsKeys->setValue("Message", listKeys.at(5).at(1));
    settingsKeys->setValue("Freezing", listKeys.at(6).at(1));
    settingsKeys->setValue("Deposit", listKeys.at(7).at(1));
    settingsKeys->setValue("Quest`", listKeys.at(8).at(1));
    settingsKeys->endGroup();
    // Чек
    settingsKeys->beginGroup("Check");
    settingsKeys->setValue("Add", listKeys.at(9).at(0));
    settingsKeys->setValue("Del", listKeys.at(10).at(0));
    settingsKeys->setValue("Save", listKeys.at(11).at(0));
    settingsKeys->setValue("Print", listKeys.at(12).at(0));
    settingsKeys->setValue("Pay", listKeys.at(13).at(0));
    settingsKeys->endGroup();
    // Поиск
    settingsKeys->beginGroup("Search");
    settingsKeys->setValue("Find", listKeys.at(14).at(0));
    settingsKeys->setValue("Clear", listKeys.at(15).at(0));
    settingsKeys->setValue("View", listKeys.at(16).at(0));
    settingsKeys->setValue("Prihod", listKeys.at(17).at(0));
    settingsKeys->endGroup();

    setHotKeys();
}

void RCommonObject::setHotKeys(){

    qDebug()<<"назначаем клавиши";
    inclubAction->setShortcut(upkeyBool?QKeySequence(listKeys.at(0).at(1)):QKeySequence(listKeys.at(0).at(0)));
    outclubAction->setShortcut(upkeyBool?QKeySequence(listKeys.at(1).at(1)):QKeySequence(listKeys.at(1).at(0)));
    checkAction->setShortcut(upkeyBool?QKeySequence(listKeys.at(2).at(1)):QKeySequence(listKeys.at(2).at(0)));
    blockAction->setShortcut(upkeyBool?QKeySequence(listKeys.at(3).at(1)):QKeySequence(listKeys.at(3).at(0)));
    phonesAction->setShortcut(upkeyBool?QKeySequence(listKeys.at(4).at(1)):QKeySequence(listKeys.at(4).at(0)));
    mailAction->setShortcut(upkeyBool?QKeySequence(listKeys.at(5).at(1)):QKeySequence(listKeys.at(5).at(0)));
    freezeAction->setShortcut(upkeyBool?QKeySequence(listKeys.at(6).at(1)):QKeySequence(listKeys.at(6).at(0)));
    depositAction->setShortcut(upkeyBool?QKeySequence(listKeys.at(7).at(1)):QKeySequence(listKeys.at(7).at(0)));
    guestAction->setShortcut(upkeyBool?QKeySequence(listKeys.at(8).at(1)):QKeySequence(listKeys.at(8).at(0)));
}


Название: Re: Динамическое назначение горячих клавиш
Отправлено: kambala от Июль 31, 2013, 09:29
проверь дебагом что в переменной list действительно содержатся новые комбинации


Название: Re: Динамическое назначение горячих клавиш
Отправлено: Alexorleon от Июль 31, 2013, 10:19
Вот что нашел. Примерно так:
при addAction к кнопке или тулбару создаётся "копия" которая и используется. После этого менять что-то в исходном экшене бессмысленно, нужно заново делать setAction для кнопки.

Поэтому придется перезапускать прогу.

В принципе тему можно закрывать, но если кто-нибудь найдет что интересное скидывайте.
Всем спасибо.


Название: Re: [РЕШЕНО] Динамическое назначение горячих клавиш
Отправлено: kambala от Июль 31, 2013, 10:33
в addAction можно указать существующий экшн, а не создавать новый


Название: Re: [РЕШЕНО] Динамическое назначение горячих клавиш
Отправлено: Alexorleon от Август 02, 2013, 10:49
в addAction можно указать существующий экшн, а не создавать новый
Хорошая мысль, попробую.