Russian Qt Forum
Май 18, 2012, 20:07
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
(Модератор:
Sergeich
) >
Замещение нескольких сигналов одним слотом
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Замещение нескольких сигналов одним слотом (Прочитано 3050 раз)
chipset
Гость
Замещение нескольких сигналов одним слотом
«
:
Июнь 27, 2007, 09:35 »
Здравствуйте подскажите как...
хоть и нашёл на
http://qt.osdn.org.ua/signalmapper.html
, не получилось
имеем:
}
Код:
//создаём 44 кнопки
QToolButton *toolButton_m1[44];
for (int i=0; i<44; i++)
{
toolButton_m1[i] = new QToolButton(widgetMap);
toolButton_m1[i]->setGeometry(QRect(250+(i*16), 43-i, 13, 3+i));
connect(toolButton_m1[i], SIGNAL(clicked()), this, SLOT(toolButton_m1_0_clicked()));
}
Как сделать универсальный слот, чтобы он мог понимать с какой кнопки нажато...
и в зависимости от кнопки делать что нибудь...
Если есть пример, буду очень рад!
Записан
pakulo
Гость
Замещение нескольких сигналов одним слотом
«
Ответ #1 :
Июнь 27, 2007, 10:47 »
А я могу еще добавить пару способов )))
Есть такой сигнал void triggered ( QAction * action )
Создаешь массив QAction, присваиваешь каждой кнопке свой экшен, а потом уже в методе проверяешь типа
for (int = 0; i < 44; i++)
{
if (actions
= action)
emit ButtonClicked(i);
}
А можно и так:
В методе toolButton_m1_0_clicked()
получаешь глобальную позицию курсора, отнимаешь позицию формы, что бы получить позицию курсора в твоей форме...
и в слоте toolButton_m1_0_clicked() проверяешь принадлежит ли курсор кнопке по циклу, ну типа
for (int = 0; i <44; ++i)
{
if (but
->geometry().contains(mousePos))
emit buttonClicked(i);
}
добавлено спустя 2 минуты:
А что именно у тебя не получилось с тем что описано в доке?
Попробуй способ "Решение с помощью QSignalMapper"
Записан
Racheengel
phpBB Супер
Offline
Сообщений: 1144
чтоб работа волком не казалась :)
Замещение нескольких сигналов одним слотом
«
Ответ #2 :
Июнь 27, 2007, 11:12 »
actionGroup() уже некруто?
Записан
:: Jedem Das Seine ::
:: Каждому - Своё ::
http://sintegrial.com
- всякий хороший Qt софт
http://www.quiss.com
- professional visual inspection systems
Steven_Orko
Бывалый
Offline
Сообщений: 490
Re: Замещение нескольких сигналов одним слотом
«
Ответ #3 :
Июнь 27, 2007, 11:32 »
Цитата: "chipset"
Как сделать универсальный слот, чтобы он мог понимать с какой кнопки нажато...
и в зависимости от кнопки делать что нибудь...
Если есть пример, буду очень рад!
Читайем Assistant:
Цитата: ""
QObject * QObject::sender () const [protected]
Returns a pointer to the object that sent the signal, if called in a slot activated by a signal; otherwise it returns 0. The pointer is valid only during the execution of the slot that calls this function.
The pointer returned by this function becomes invalid if the sender is destroyed, or if the slot is disconnected from the sender's signal.
Warning: This function violates the object-oriented principle of modularity. However, getting access to the sender might be useful when many signals are connected to a single slot.
See also QSignalMapper.
Код:
void My_MainWindow::my_universal_slot_for_buttons(void)
{
//Получаем указатель, на кнопку, которая послала сигнал
QPushButton* pButton = (QPushButton*) sender();
if (NULL != pButton)
{//Если вдруг слот не вызвался сам по себе, а по сигналу, то
if (pMy_First_Button == pButton)
{
}
if (pMy_seconf_Button = pButton)
{
}
} //if (NULL != pButton)
}
Записан
pastor
Administrator
Джедай : наставник для всех
Online
Сообщений: 2871
Замещение нескольких сигналов одним слотом
«
Ответ #4 :
Июнь 27, 2007, 12:40 »
Можно ещё заюзать QButtonGroup
Код:
QButtonGroup *btnGrp = new QButtonGroup(this);
//создаём 44 кнопки
QToolButton *toolButton_m1[44];
for (int i=0; i<44; i++)
{
toolButton_m1[i] = new QToolButton(widgetMap);
toolButton_m1[i]->setGeometry(QRect(250+(i*16), 43-i, 13, 3+i));
btnGrp->addButton(toolButton_m1[i]);
}
connect(btnGrp, SIGNAL(buttonClicked( QAbstractButton *)), this, SLOT(toolButton_m1_0_clicked( QAbstractButton *)));
Записан
Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
chipset
Гость
Замещение нескольких сигналов одним слотом
«
Ответ #5 :
Июнь 27, 2007, 13:05 »
Цитата: "pastor"
Можно ещё заюзать QButtonGroup
Код:
QButtonGroup *btnGrp = new QButtonGroup(this);
//создаём 44 кнопки
QToolButton *toolButton_m1[44];
for (int i=0; i<44; i++)
{
toolButton_m1[i] = new QToolButton(widgetMap);
toolButton_m1[i]->setGeometry(QRect(250+(i*16), 43-i, 13, 3+i));
btnGrp->addButton(toolButton_m1[i]);
}
connect(btnGrp, SIGNAL(buttonClicked( QAbstractButton *)), this, SLOT(toolButton_m1_0_clicked( QAbstractButton *)));
а слот как должен выглядеть?
Записан
pastor
Administrator
Джедай : наставник для всех
Online
Сообщений: 2871
Замещение нескольких сигналов одним слотом
«
Ответ #6 :
Июнь 27, 2007, 13:18 »
Цитата: "chipset"
а слот как должен выглядеть?
К примеру так:
Код:
void My_MainWindow::toolButton_m1_0_clicked(QAbstractButton *pressedButton)
{
QToolButton *btn = qobject_cast<QToolButton *>(pressedButton);
<do something with btn>
}
Записан
Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
chipset
Гость
Замещение нескольких сигналов одним слотом
«
Ответ #7 :
Июнь 28, 2007, 07:32 »
Цитата: "pastor"
Цитата: "chipset"
а слот как должен выглядеть?
К примеру так:
Код:
void My_MainWindow::toolButton_m1_0_clicked(QAbstractButton *pressedButton)
{
QToolButton *btn = qobject_cast<QToolButton *>(pressedButton);
<do something with btn>
}
У меня не получается. т.к. начинающий (ещё и тупой :roll: ) ..
У меня не получается сделать слот, в котором я могу видить на какую кнопку нажали... допустим.. если нажали на toolButton_m1[1] тогда ...
Как это реализовать, не подскажите?
Записан
Steven_Orko
Бывалый
Offline
Сообщений: 490
Замещение нескольких сигналов одним слотом
«
Ответ #8 :
Июнь 28, 2007, 09:15 »
Код:
void My_MainWindow::toolButton_m1_0_clicked(QAbstractButton *pPressedButton)
{
QToolButton *pBtn = qobject_cast<QToolButton *>(pPressedButton);
if ((NULL != pBtn) && (toolButton_m1[1] == pBtn)
{
QMessageBox::critical(NULL, "Паника!!!!", "Кто-то нажал на кнопку toolButton_m1[1].");
}
}
Записан
chipset
Гость
Замещение нескольких сигналов одним слотом
«
Ответ #9 :
Июнь 28, 2007, 10:34 »
Цитата: "Steven_Orko"
Код:
void My_MainWindow::toolButton_m1_0_clicked(QAbstractButton *pPressedButton)
{
QToolButton *pBtn = qobject_cast<QToolButton *>(pPressedButton);
if ((NULL != pBtn) && (toolButton_m1[1] == pBtn)
{
QMessageBox::critical(NULL, "Паника!!!!", "Кто-то нажал на кнопку toolButton_m1[1].");
}
}
Всё работает, спасибо большое
Записан
KocMak
Новичок
Offline
Сообщений: 4
Re: Замещение нескольких сигналов одним слотом
«
Ответ #10 :
Декабрь 04, 2011, 18:03 »
Здравствуйте.
Прошу помощи для решения подобной проблемы.
Есть несколько кнопок с метками btStart, btStop... При нажатии на кнопки надо вызывать один слот, но, в зависимости от нажатой кнопки, передавать разное значение переменной command.
Я новичок в написание программ на Qt, да и вообще на ООП, но есть опыт программирования на структурном С. Поэтому я написал примерно так:
Код:
int command=0;
int newcommand=0;
connect(btStart, SIGNAL(clicked()), this, SLOT(SendCommand(1))); //Если нажата кнопка btStart вызвать "SendCommand" и передать "command=1"
connect(btStop, SIGNAL(clicked()), this, SLOT(SendCommand(2)));
...
void MaimWindow::SendCommand(int command)
{
newcommand=command; //Например
}
Подскажите, пожалуйста, как реализовать такую конструкцию на Qt? Спасибо.
Записан
kambala
phpBB Житель матрицы
Offline
Сообщений: 1247
Re: Замещение нескольких сигналов одним слотом
«
Ответ #11 :
Декабрь 04, 2011, 18:34 »
нет, это неправильно. у слота не может быть параметров больше, чем у сигнала.
есть несколько способов достичь желаемого результата, и, пожалуй, самый оптимальный из них для количества кнопок > 2 - использование QSignalMapper. в документации к этому классу есть отличный пример (и как раз про кнопки).
да, и, как по мне, прежде, чем лезть в приложения "с окошками", неплохо бы просто разобраться с С++ и ООП на примере консольных приложений.
Записан
K.A.M.B.A.L.A.: Kinetic Artificial Machine Built for Assassination and Logical Analysis
KocMak
Новичок
Offline
Сообщений: 4
Re: Замещение нескольких сигналов одним слотом
«
Ответ #12 :
Декабрь 04, 2011, 20:37 »
Спасибо за помощь, буду разбираться с QSignalMapper.
Записан
FreeSlave
Новичок
Offline
Сообщений: 17
Re: Замещение нескольких сигналов одним слотом
«
Ответ #13 :
Декабрь 15, 2011, 18:43 »
У меня похожий вопрос.
Есть массив кнопок, есть несколько методов. Нужно, чтобы при нажатии на каждую из кнопок вызывалась определенная функция (у каждой кнопки - своя). Хотелось бы присоединить в цикле, но не знаю, что делать со SLOT( ), ведь туда нужно посылать название функции, а у них имена разные.
Конечно, можно унаследовать класс кнопки, посылать в каждую свой указатель на функцию, и переопределить нажатие на выполнение данной функции (вместо высылки сигнала), но возможно ли реализовать вышеизложенное без создания новых классов?
Записан
kambala
phpBB Житель матрицы
Offline
Сообщений: 1247
Re: Замещение нескольких сигналов одним слотом
«
Ответ #14 :
Декабрь 15, 2011, 20:01 »
раз все слоты разные, то напрямую посоединять каждую кнопку с нужным слотом. ну или временно создать массив указателей на методы (слоты) и законнектить все в цикле.
Записан
K.A.M.B.A.L.A.: Kinetic Artificial Machine Built for Assassination and Logical Analysis
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
=> Архив
===> Программирование
=====> Python
===> Веб программирование
=====> PHP, PERL, CGI
Загружается...