crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Программное нажатие кнопки (pushButton)
Zet2010
  опции профиля:
сообщение 10.1.2017, 18:51
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 7.1.2017
Пользователь №: 4690

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день. У меня такой вопрос. У меня программе есть 2 кнопки (pushButton), созданные в дизайнере. Обе выполняют задачи по включению и выключению чего либо ( но не одного и того же). Мне понадобилось в некоторых случаях, что бы одна кнопка (при нажатии на неё), нажималась не только сама, но и нажимала второю кнопку. Реализовал я это несколькими методами (во сех возникает проблема), остановился я на варианте ui->pushButton_2->clicked(false); Думаю он самый верный и именно через него надо воздействовать на 2-ю кнопку.

...
connect(ui->pushButton_2,SIGNAL(clicked(bool)),this,SLOT(key1(bool)));
connect(ui->pushButton_2,SIGNAL(clicked(bool)),this,SLOT(key2(bool)));
...
void MainWindow::key1(bool checked)
{
    if(checked)
    {
        ...// например что то включаем ON
        return;
    }
    else
    {
        ...// например что то выключаем OFF
       ui->pushButton_2->clicked(false);        // нажимем вторую кнопку
    }
}


void MainWindow::key2(bool checked)
{
    if(checked)
    {
        ...// например что то включаем ON (не связанно с 1 кнопкой)
        return;
    }
    else
    {
        ...// например что то выключаем OFF (не связанно с 1 кнопкой)
    }
}


Всё выключается правильно , после нажатия на 1 кнопку (мышкой), повторное нажатие на 1 кнопку включает состояние 1 кнопки в ON, вторая кнопка остаётся в OFF и если теперь кликнуть мышкой по 2- рой кнопке, кнопка не реагирует и только после повторного клика по 2 кнопке, она становится ON.

Проблема в двойном нажатии на 2-ю кнопку, по идеи она должна и с первого клика срабатывать, но что я видимо делаю не так?





Ошибся я в первой строке , правильный вариант:

 connect(ui->pushButton_1,SIGNAL(clicked(bool)),this,SLOT(key1(bool)));
connect(ui->pushButton_2,SIGNAL(clicked(bool)),this,SLOT(key2(bool)));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 11.1.2017, 9:22
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2920
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 202 раз(а)




Репутация:   35  


попробуй так

//путаницу убираем нафиг ))
// connect(ui->pushButton_2,SIGNAL(clicked(bool)),this,SLOT(key1(bool)));
// connect(ui->pushButton_2,SIGNAL(clicked(bool)),this,SLOT(key2(bool)));

//стандартный обработчик первой кнопки
void MainWindow::key1(bool checked)
{
    if(checked)
    {
        ...;// например что то включаем ON
    }
    else
    {
        ...;// например что то выключаем OFF
    }

   correctButtonsStates();
}

//стандартный обработчик второй кнопки
void MainWindow::key2(bool checked)
{
    if(checked)
    {
        ...;// например что то включаем ON (не связанно с 1 кнопкой)
    }
    else
    {
        ...;// например что то выключаем OFF (не связанно с 1 кнопкой)
    }

   correctButtonsStates();
}


void MainWindow::correctButtonsStates()
{
    //тут проверить и исправить текущие статусы кнопок. Нужное нажать/отжать
//isChecked(), setChecked()
//...
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Zet2010
  опции профиля:
сообщение 11.1.2017, 20:33
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 7.1.2017
Пользователь №: 4690

Спасибо сказали: 0 раз(а)




Репутация:   0  


Алексей1153 - спасибо за подсказку, Вы указали на верный вариант решения .

Привожу рабочий код , возможно кому то будет полезен:

//стандартный обработчик первой кнопки
void MainWindow::key1(bool checked)
{
    if(checked)
    {
        ...;// например что то включаем ON
    }
    else
    {
        ui->pushButton_2->clicked(false);      //  нажимаем 2-ю кнопку (она срабатывает как выключатель - OFF)
        if(ui->pushButton_2->isChecked()) ui->pushButton_2->setChecked(false); // устраняем необходимость повторного нажатия мышкой 2 кнопки
        ...;// например что то выключаем OFF
    }
}

//стандартный обработчик второй кнопки
void MainWindow::key2(bool checked)
{
    if(checked)
    {
        ...;// например что то включаем ON (не связанно с 1 кнопкой)
    }
    else
    {
        ...;// например что то выключаем OFF (не связанно с 1 кнопкой)
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 12.1.2017, 9:35
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2920
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 202 раз(а)




Репутация:   35  


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

Есть две функции , в которые передаётся значение bool (это, в частности, текущее положение кнопки) , эти функции могут друг друга вызывать, также эти функции вообще кто угодно может вызвать. После выполнения функций нужно отобразить на кнопках (если они есть :) ) текущее положение дел - нужную поднять/утопить (без генерации сигналов, чисто отображение - setChecked() )

Тогда не будет путаницы в сигналах от GUI

--------------

немного наврал, чтобы сигнал не эмитировался, нужно использовать не setChecked() , а

Цитата
down : bool
This property holds whether the button is pressed down.
If this property is true, the button is pressed down. The signals pressed() and clicked() are not emitted if you set this property to true. The default is false.
Access functions:

bool
isDown() const
void
setDown(bool)


Сообщение отредактировал Алексей1153 - 12.1.2017, 9:36
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.3.2017, 12:59