Russian Qt Forum

Qt => Вопросы новичков => Тема начата: SibVenn от Сентябрь 30, 2018, 18:18



Название: Как передать параметр в слот?
Отправлено: SibVenn от Сентябрь 30, 2018, 18:18
Добрый день. Возникла проблема, которую я никак не могу решить.
Так вот...

Есть вот такая-вот штучка
       
Код:
     QObject::connect(&FIELD[i][j], SIGNAL(clicked()),this,SLOT(changeIcons()));
которая вызывает вот это вот:

Код:
void gameField::changeIcons()
{
   qDebug() << "it's works" << endl;
}

Пока в слоте changeIcons() нет параметров, все работает ну просто идеально. Но как только пытаюсь добавить туда параметр, все работать просто перестает. Например
     
Код:
      QObject::connect(&FIELD[i][j], SIGNAL(clicked()),this,SLOT(changeIcons(FIELD[[i][j]])));
уже просто не работает.

p.s. Понимаю, что спрашиваю, наверное, крайне банальные вещи, но сам я ничего не нашел. А что нашел, не смог повторить... ;)



Название: Re: Как передать параметр в слот?
Отправлено: Alex Custov от Сентябрь 30, 2018, 19:14
Ты хочешь в слоте узнать кто его вызвал? Используй метод sender()


Название: Re: Как передать параметр в слот?
Отправлено: kambala от Октябрь 01, 2018, 01:09
QSignalMapper. да и на форуме этот вопрос задавался уже миллион раз.


Название: Re: Как передать параметр в слот?
Отправлено: Igors от Октябрь 01, 2018, 02:53
Пока в слоте changeIcons() нет параметров, все работает ну просто идеально. Но как только пытаюсь добавить туда параметр, все работать просто перестает. Например
     
Код:
      QObject::connect(&FIELD[i][j], SIGNAL(clicked()),this,SLOT(changeIcons(FIELD[[i][j]])));
уже просто не работает.
А откуда "испускающий" (clicked) возьмет этот параметр? Сигнал может передать только то что имеет (в данном случае checked). Иначе, как уже ответили, в слоте можно получить только sender'а - и все.

И лучше использовать новый синтаксис (адреса ф-ций), а если по-старинке то заглядывайте в консоль - там пишут почему connect не удался


Название: Re: Как передать параметр в слот?
Отправлено: zhbr от Октябрь 01, 2018, 09:42
QSignalMapper. да и на форуме этот вопрос задавался уже миллион раз.
не рекомендуется для нового кода использовать QSignalMapper: This class is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.


Название: Re: Как передать параметр в слот?
Отправлено: kambala от Октябрь 01, 2018, 14:58
не видел такой информации, спасибо.

судя по SIGNAL и SLOT еще неизвестно использует ли ТС Qt 5.


Название: Re: Как передать параметр в слот?
Отправлено: sergek от Октябрь 01, 2018, 16:09
судя по SIGNAL и SLOT еще неизвестно использует ли ТС Qt 5.
Судя по вопросу, TC вообще новичок в Qt. А начинать с 4.8, когда уже есть 5.11 может только большой оригинал))


Название: Re: Как передать параметр в слот?
Отправлено: Авварон от Октябрь 02, 2018, 22:41
не видел такой информации, спасибо.

ну теперь же лямбду оч просто повесить с нужным значением в контексте


Название: Re: Как передать параметр в слот?
Отправлено: ЙадоФитый ПлюсЧ от Октябрь 26, 2018, 17:48
Прошу прощения за оффтоп.
Судя по вопросу, TC вообще новичок в Qt. А начинать с 4.8, когда уже есть 5.11 может только большой оригинал))
Не согласен. Если вы вынуждены использовать CentOS 6.9 и унаследованные от нее дистрыбутивы, то Qt5 вам нужно или собирать самому Qt5, или искать левые репозитрии.


Название: Re: Как передать параметр в слот?
Отправлено: sergek от Октябрь 26, 2018, 19:49
Не согласен. Если вы вынуждены использовать CentOS 6.9 и унаследованные от нее дистрыбутивы, то Qt5 вам нужно или собирать самому Qt5, или искать левые репозитрии.
Без иксов - да. А так - онлайн инсталлер и ставь, что хочешь.


Название: Re: Как передать параметр в слот?
Отправлено: zhbr от Октябрь 27, 2018, 11:22
Без иксов - да. А так - онлайн инсталлер и ставь, что хочешь.
онлайн инсталлер можно юзать и без иксов. у себя делал так:
Код:
./qt-unified-linux-x64-3.0.5-online.run --verbose --platform minimal --script qtni5101.qs

в qtni5101.qs:
Код:
function Controller() {
    installer.autoRejectMessageBoxes();
    installer.installationFinished.connect(function() {
        gui.clickButton(buttons.NextButton);
    })
}

Controller.prototype.WelcomePageCallback = function() {
    gui.clickButton(buttons.NextButton, 3000);
}

Controller.prototype.CredentialsPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.IntroductionPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.TargetDirectoryPageCallback = function()
{
    gui.currentPageWidget().TargetDirectoryLineEdit.setText("/opt/qt");
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.ComponentSelectionPageCallback = function() {
    var widget = gui.currentPageWidget();

    widget.deselectAll();
   
    widget.selectComponent("qt.qt5.5101.gcc_64");
    widget.selectComponent("qt.qt5.5101.qtquickcontrols");
    widget.selectComponent("qt.qt5.5101.qtquickcontrols2");

    gui.clickButton(buttons.NextButton);
}

Controller.prototype.LicenseAgreementPageCallback = function() {
    gui.currentPageWidget().AcceptLicenseRadioButton.setChecked(true);
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.StartMenuDirectoryPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.ReadyForInstallationPageCallback = function()
{
    gui.clickButton(buttons.NextButton);
}
Controller.prototype.FinishedPageCallback = function() {
var checkBoxForm = gui.currentPageWidget().LaunchQtCreatorCheckBoxForm
if (checkBoxForm && checkBoxForm.launchQtCreatorCheckBox) {
    checkBoxForm.launchQtCreatorCheckBox.checked = false;
}
    gui.clickButton(buttons.FinishButton);
}


Название: Re: Как передать параметр в слот?
Отправлено: sergek от Октябрь 27, 2018, 19:13
онлайн инсталлер можно юзать и без иксов. у себя делал так:
Код:
./qt-unified-linux-x64-3.0.5-online.run --verbose --platform minimal --script qtni5101.qs
Ух ты. Надо попробовать...


Название: Re: Как передать параметр в слот?
Отправлено: sergek от Декабрь 10, 2018, 16:40
Попробовал.. Обломался на старте:
Цитировать
sergek@Toshiba:~$ ./qt-unified-linux-x64-online.run --verbose --platform minimal --script qtni5.qs
IFW Version: 3.0.5, built with Qt 5.9.5.
Build date: Jun 12 2018
Installer Framework SHA1: 59aa5f1
  • Language: ru-RU
  • Arguments: ./qt-unified-linux-x64-online.run, --verbose, --script, qtni5.qs
  • [2] Operations sanity check succeeded.
    [3] License read from resource file: "enterprise"
    [3] Reading Qt Account settings from disk: "/home/sergek/.local/share/Qt/qtaccount.ini"
    [3] QtAccount information:
    [3] Login completed: false
    [3] Email: "sergek@..."
    [4] Total number of licenses: 0
    [4] Account type: 3
    [4] Resource tree:
    [4]      :/translations
    ..
Как заполнять этот qtaccount.ini, нигде не нашел. Кто-нибудь в курсе?


Название: Re: Как передать параметр в слот?
Отправлено: zhbr от Декабрь 11, 2018, 15:18
а этот qt account вам действительно нужен?

в моём случае я это скипаю
Код:
Controller.prototype.CredentialsPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}


Название: Re: Как передать параметр в слот?
Отправлено: sergek от Декабрь 11, 2018, 16:38
Так я ваш скрипт и взял в качестве примера))
Возможно, я чего не догоняю - инсталлятор выводит пару строк
Цитировать
[166] Loaded control script "qtni5.qs"
[166] Using control script: "qtni5.qs"
и все застревает. В /tmp/ создается каталог и lock-файл и больше ничего не происходит.

Да, в общем, и фиг с ним. Потом разберусь.


Название: Re: Как передать параметр в слот?
Отправлено: zhbr от Декабрь 12, 2018, 07:40
может прав не хватает для установки в заданную директорию? я смотрю вы запускаете не от рута. можно запустить на линуксе с иксами, убрав параметр "--platform minimal", и пронаблюдать на каком этапе спотыкается инсталлер.

у меня такой механизм применяется для построения docker образов для CI/CD. вот https://hub.docker.com/r/alekseyyaroslavcev/linuxqt5101/builds/bq9j7zchm2bunwhgmkbqjr5/ (https://hub.docker.com/r/alekseyyaroslavcev/linuxqt5101/builds/bq9j7zchm2bunwhgmkbqjr5/) свежий лог сборки такого образа. там же есть ссылка на гитхаб-репозиторий со всеми исходниками.


Название: Re: Как передать параметр в слот?
Отправлено: sergek от Декабрь 12, 2018, 14:39
Когда инсталлятор запускается от пользователя, Qt устанавливается в домашний каталог.
Спасибо, попробую попозже.


Название: Re: Как передать параметр в слот?
Отправлено: zhbr от Декабрь 13, 2018, 07:48
в моем скрипте путь принудительно задаётся

Код:
Controller.prototype.TargetDirectoryPageCallback = function()
{
    gui.currentPageWidget().TargetDirectoryLineEdit.setText("/opt/qt");
    gui.clickButton(buttons.NextButton);
}


Название: Re: Как передать параметр в слот?
Отправлено: sergek от Декабрь 13, 2018, 11:07
Кажется, дело было не в скрипте, а в доступе к qt.io - этот ресурс периодически бывает недоступен. Сейчас запустил, все поехало. Спасибо.