Russian Qt Forum
Ноябрь 27, 2024, 03:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Qt3]проблема с кнопками !  (Прочитано 8597 раз)
remiznik
Гость
« : Июнь 20, 2008, 19:27 »

большая программа но в ней есть трудности
суть программы которую пишу ! создаю кнопки и надо чтоб при нажатии на них выскакивало диалоговое окно ColorDialog в котором выбирали нужный цвет и в последствии этот цвет становился фоновым для кнопки которая вызвала диалог ! немогу никак разобраться как отловить какая кнопка из массива кнопок вызвана !! вот пример кода !

вот массив галочек и кнопок !!! тут же и соединение с сигналом вызывавшим диалоговое окно !

Код:
for (i=0; i<8; i++)
  {
    CB[i] = new QCheckBox( this, "CB" );
    CB[i]->setGeometry( QRect( 10+i*40, 15, 40, 20 ) );
    CBB[i]=new QPushButton(" ",BoxChecker);
    CBB[i]->setFlat(true);
    CBB[i]->setGeometry(10+i*40, 35, 13, 13);
        connect(CBB[i],SIGNAL(clicked()),
                    SLOT(slotGetColor()));

   }
вот сам слот

Код:
void CheckForm::slotGetColor()
{
    QColor color=QColorDialog::getColor(blue,this);
     if(!color.isValid())
    {
    }
    else // при нажатии ОК здесь должен сменится цвет кнопки !
    { 
             if(CBB[1]->isOn())
              CBB[1]->setPaletteBackgroundColor(color);
    }             
}
трудность в том не понимаю как из масива событий поймать нажатую кнопку !


если надо могу кинуть полный исходник программы вызывавшей чекбокс с кнопками !
« Последнее редактирование: Июнь 20, 2008, 23:30 от pastor » Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #1 : Июнь 20, 2008, 19:36 »

большая программа но в ней есть трудности
суть программы которую пишу ! создаю кнопки и надо чтоб при нажатии на них выскакивало диалоговое окно ColorDialog в котором выбирали нужный цвет и в последствии этот цвет становился фоновым для кнопки которая вызвала диалог ! немогу никак разобраться как отловить какая кнопка из массива кнопок вызвана !! вот пример кода !

вот массив галочек и кнопок !!! тут же и соединение с сигналом вызывавшим диалоговое окно !

for (i=0; i<8; i++)
  {
    CB = new QCheckBox( this, "CB" );
    CB->setGeometry( QRect( 10+i*40, 15, 40, 20 ) );
    CBB=new QPushButton(" ",BoxChecker);
    CBB->setFlat(true);
    CBB->setGeometry(10+i*40, 35, 13, 13);
        connect(CBB,SIGNAL(clicked()),
                    SLOT(slotGetColor()));

   }
вот сам слот

void CheckForm::slotGetColor()
{
    QColor color=QColorDialog::getColor(blue,this);
     if(!color.isValid())
    {
    }
    else // при нажатии ОК здесь должен сменится цвет кнопки !
    { 
             if(CBB[1]->isOn())
              CBB[1]->setPaletteBackgroundColor(color);
    }             
}

трудность в том не понимаю как из масива событий поймать нажатую кнопку !


если надо могу кинуть полный исходник программы вызывавшей чекбокс с кнопками !


В слоте используй sender(). Получишь указатель на объект испустивший сигнал.

const QObject * QObject::sender () [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.

Записан
remiznik
Гость
« Ответ #2 : Июнь 20, 2008, 19:44 »

слушай я не очень пока в Qt  можеш привести код как мне это использовать и где ? в слоте getColor? или сразу после connect ?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Июнь 20, 2008, 22:16 »

чет я немного туплю, а как у тебя объявлены CB и CBB? покажы  весь код.
Записан

Юра.
Sergeich
Гость
« Ответ #4 : Июнь 20, 2008, 22:31 »

Код:
void CheckForm::slotGetColor()
{   
    QColor color=QColorDialog::getColor(blue,this);
     if(!color.isValid())
    {
    }
    else // при нажатии ОК здесь должен сменится цвет кнопки !
    {
            if ( sender() && sender()->inherits("QPushButton") ) {
                QPushButton* button = (QPushButton*) sender();
                button->setPaletteBackgroundColor(color);
            }
    }       
}
Записан
remiznik
Гость
« Ответ #5 : Июнь 20, 2008, 22:39 »

работает !!! но я не понимаю смысла вот это строк

QPushButton* button = (QPushButton*) sender();

зачем мы создаём ешё какуюто кнопку ?
и понимаешь .... эти кнопки будут в основной програме привзяна к цвету графика при выборе цвета должен менятся цвет гравика на цвет выбраный и отрожаемый фоном кнопки !
например первая кнопка это первый график вторая кнопка вторая !!! как мне определить где какая кнопка ?
« Последнее редактирование: Июнь 20, 2008, 22:55 от remiznik » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Июнь 20, 2008, 23:28 »

работает !!! но я не понимаю смысла вот это строк

QPushButton* button = (QPushButton*) sender();

зачем мы создаём ешё какуюто кнопку ?

уууу товарищь, это практически азы! Вам сначало нужно С\С++ изучить, а потом уже за Qt браться


как мне определить где какая кнопка ?

1) Задать имя объекта. см. setName
2) можно ещё заюзать QSignalMapper и задать айди для каждой кнопки.

Как по мне, второе предпочтительнее

ЗЫ: И так, на будующее, пользуйтесь тегами КОД, когда постите код
« Последнее редактирование: Июнь 20, 2008, 23:35 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Sergeich
Гость
« Ответ #7 : Июнь 20, 2008, 23:50 »

2 pastor: опередил Улыбающийся
Гмм... тяжелый случай Веселый
Цитировать
работает !!! но я не понимаю смысла вот это строк
QPushButton* button = (QPushButton*) sender();
зачем мы создаём ешё какуюто кнопку ?
Работает - тогда ничего не трогай... Веселый Кнопка тут не создается, это простое приведение типа из QObject* в QPushButton*. Новые кнопки создаются оператором new Улыбающийся
Цитировать
и понимаешь .... эти кнопки будут в основной програме привзяна к цвету графика при выборе цвета должен менятся цвет гравика на цвет выбраный и отрожаемый фоном кнопки !
например первая кнопка это первый график вторая кнопка вторая !!! как мне определить где какая кнопка ?
Тогда юзай QSignalMapper:
Код:
// Создаем кнопки

QSignalMapper* mapper = QSignalMapper( widget );
connect( mapper, SIGNAL(mapped(int)), widget, SLOT(onButtonClick(int)) );
QValueVector<QPushButton*> buttonArray;
for ( int i=0; i < numButtons; i++ ) {
QPushButton* button = new QPushButton( "", widget );
            buttonArray.append(button);
//...
mapper->setMapping( button, i );
connect( button, SIGNAL(clicked()), mapper, SLOT(map()) );
}
            
// Обрабатываем нажатие кнопки

void CheckForm::onButtonClick( int i )
{
    QPushButton* button = buttonArray[i];
    QColor color = QColorDialog::getColor(blue,this);
    if(!color.isValid())
     return;
    button->setPaletteBackgroundColor(color);
//...
}
P.S. Уроки русского языка в школе прогуливал? Подмигивающий
« Последнее редактирование: Июнь 20, 2008, 23:54 от Sergeich » Записан
remiznik
Гость
« Ответ #8 : Июнь 21, 2008, 15:24 »

да уроки русского косил !!
на счёт кнопки вы правы что-то я на косячил ....))
а на счот задать айди для каждой кнопки я это с самога начала хотел зделать только не очень понимал как это реализовать !
Код:
QValueVector<QPushButton*> buttonArray;
это обезательно делать ?
Код:
mapper->setMapping( button, i );
разве нельзя его просто использовать для нажатой кнопки !!!
Код:
QSignalMapper* mapper = QSignalMapper( widget );
почему widget ? в описании написано что там должен быть указатель на форму вызова у меня это CheckForm !


и ешё я не очень понял в какой переменой хранится нажатая кнопка ?   
код не работает пишит что No such slot QGroupBox::onButtonClick(int) !!!
« Последнее редактирование: Июнь 21, 2008, 16:45 от remiznik » Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #9 : Июнь 21, 2008, 18:28 »

да уроки русского косил !!
на счёт кнопки вы правы что-то я на косячил ....))
а на счот задать айди для каждой кнопки я это с самога начала хотел зделать только не очень понимал как это реализовать !
Код:
QValueVector<QPushButton*> buttonArray;
это обезательно делать ?
Код:
mapper->setMapping( button, i );
разве нельзя его просто использовать для нажатой кнопки !!!
Код:
QSignalMapper* mapper = QSignalMapper( widget );
почему widget ? в описании написано что там должен быть указатель на форму вызова у меня это CheckForm !


и ешё я не очень понял в какой переменой хранится нажатая кнопка ?   
код не работает пишит что No such slot QGroupBox::onButtonClick(int) !!!

QValueVector<QPushButton*> buttonArray; для хранения указателей на ваши кнопки.

Код не работает потому, чт бездумно поправлен.
Конечно QGroupBox не имеет слота onButtonClick(int).
Создай слот onButtonClick(int) и в нем веди обработку как писал Sergeich.
Записан
remiznik
Гость
« Ответ #10 : Июнь 21, 2008, 18:52 »

Цитировать
Код не работает потому, чт бездумно поправлен.
Конечно QGroupBox не имеет слота onButtonClick(int).
Создай слот onButtonClick(int) и в нем веди обработку как писал Sergeich.
я конечно не профессионал но слот создал !!
Код:
#include <qapplication.h>
#include "test.h"
#include <qgroupbox.h>
#include <qcheckbox.h>
#include <qpushbutton.h>
#include <qsettings.h>
#include <qbuttongroup.h>
#include <qpushbutton.h>
#include <qwidget.h>
#include <qpixmap.h>
#include <qdialog.h>
#include <qcolordialog.h>
#include <qvbox.h>
#include <qbutton.h>
#include <qsignalmapper.h>
#include <qvaluevector.h>


CheckForm::CheckForm( QWidget* parent, const char* name, bool modal, WFlags fl )
    : QDialog( parent, name, modal, fl )

{
    if ( !name )
setName( tr("CheckForm") );
   
    setCaption( trUtf8("Checker"));
   
    BoxChecker = new QGroupBox( this, "BoxChecker" );
    BoxChecker->setGeometry( QRect( 0, 0, 370, 100 ) );
    BoxChecker->setTitle(trUtf8("BoxChecker"));

 
  QSignalMapper* mapper = new QSignalMapper( BoxChecker );
  connect( mapper, SIGNAL(mapped(int)), BoxChecker, SLOT(onButtonClick(int)) );
  for (i=0; i<8; i++)
  {
    CB[i] = new QCheckBox( this, "CB" );
    CB[i]->setGeometry( QRect( 10+i*40, 15, 40, 20 ) );
    button=new QPushButton(" ",BoxChecker);
    button->setFlat(true);
    button->setGeometry(10+i*40, 35, 13, 13);
    buttonArray.append(button);
    mapper->setMapping( button, i );
connect( button, SIGNAL(clicked()), mapper, SLOT(map()) );
   }
    resize( QSize(371, 50).expandedTo(minimumSizeHint()) );
    readSettings();
}

CheckForm::~CheckForm()
{
    // no need to delete child widgets, Qt does it all for us
}
void CheckForm::writeSettings()
{
  QSettings settings;
  settings.beginGroup("/CheckForm");
  settings.writeEntry("/geometry/x", x());
  settings.writeEntry("/geometry/y", y());
  settings.endGroup();
}
void CheckForm::readSettings()
{
  QSettings settings;
  settings.beginGroup("/CheckForm");
  int x = settings.readNumEntry("/geometry/x", 300);
  int y = settings.readNumEntry("/geometry/y", 300);     
  move(x, y);
  settings.endGroup();
}
void CheckForm::closeEvent(QCloseEvent* ce)
{
writeSettings();
ce->accept();

void CheckForm::onButtonClick( int i )
{
    QPushButton* button = buttonArray[i];
    QColor color = QColorDialog::getColor(blue,this);
    if(!color.isValid())
    return;
    else{
    button->setPaletteBackgroundColor(color); }
//...
}
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #11 : Июнь 21, 2008, 19:35 »

я конечно не профессионал но слот создал !!

А де ты создал этот слот? В CheckForm? А конектишь тогда зачем к QGroupBox?

Цитировать
connect( mapper, SIGNAL(mapped(int)), BoxChecker, SLOT(onButtonClick(int)) );

тогда уж нужно так:

Цитировать
connect( mapper, SIGNAL(mapped(int)), this, SLOT(onButtonClick(int)) );
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
remiznik
Гость
« Ответ #12 : Июнь 22, 2008, 12:44 »

но я всёравно не понимаю где там хронится номер вызваной кнопки и как мне получить его ?
Записан
Sergeich
Гость
« Ответ #13 : Июнь 22, 2008, 13:52 »

но я всёравно не понимаю где там хронится номер вызваной кнопки и как мне получить его ?
Номер кнопки хранится в QSignalMapper, устанавливается методом setMapping, а получить его можно из параметра i слота CheckForm::onButtonClick
« Последнее редактирование: Июнь 22, 2008, 13:59 от Sergeich » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.16 секунд. Запросов: 22.