Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Ответ на нажатие кнопки

Автор: AD 11.4.2008, 13:34

Для того, чтобы поймать реакцию на нажатие кнопки надо использовать сигналы и слоты? Можно маленький примерчик.

ПыСы Простите за такие глупые вопросы, просто что-то не получается поймать реакцию на нажатие кнопки OK, Cancel, для выхода из второстепенного диалогового окна в главное приложение!

Автор: ViGOur 11.4.2008, 13:38

Угу, сигналы и слоты.
Вот пример: http://crossplatform.ru/documentation/qtdoc4.3/tutorial-t2.php

Автор: AD 11.4.2008, 13:52

Цитата(ViGOur @ 11.4.2008, 14:38) *
Угу, сигналы и слоты.
Вот пример: http://crossplatform.ru/documentation/qtdoc4.3/tutorial-t2.php

сработало, спасибо!!!! :)

Автор: AD 11.4.2008, 18:04

Вопрос посложнее: есть файл, из которого считываются нужные цвета кнопок. Затем заполняется в цикле массив кнопок. Как мне узнать на какую кнопку нажали? С помощью какого сигнала или слота это определить?

Заполнение:

void QDialDistParam::setupDialog(QWidget* dialog)
{
for(int i = tab_mas[tab_index].index + 1; i<dist_vec -> size(); ++i)
        {
            string type = (*dist_vec)[i].getType().toStdString();
            if(type != "Tab")
            {
                string param_name_str = (*dist_vec)[i].getPrName().toStdString();
                QString param_name = (*dist_vec)[i].getPrName();
                if(type == "CheckBox")
                {
                    //
                }
                else if(type == "PushButton")
                {
                    param_name.insert(0, btn_inset);
                    params[param_index].btnColor = new QPushButton(dist_tabs[k]);
                    params[param_index].btnColor -> setObjectName(param_name);
                    params[param_index].btnColor -> setGeometry(btn_x, y, btn_width, btn_height);

                    QString style_sheet = "* { background-color: ";
                    style_sheet += (*dist_vec)[i].getColor();
                    style_sheet += " }";
                    params[param_index].btnColor -> setStyleSheet(style_sheet);
                    connect(params[param_index].btnColor, SIGNAL(pressed()),
                                this, SLOT(btnColorClick())); //// жирным выделен важный кусок кода, на который и следует обратить внимание
                    ++param_index;
                    param_count = param_index;
                    y += 30;
                }
            }
            else break;
        }
        distGraphics -> addTab(dist_tabs[k], QString());
}

Функция узнавания нажатой кнопки:
 
void QDialDistParam::btnColorClick()
{
    QColor color = QColorDialog::getColor();
    QString color_name = color.name();
    for(int k=0; k<param_count; ++k)
        if(btnSave -> isChecked()) /// ????????????????
        {
            QString style_sheet = "* { background-color: ";
            style_sheet += color_name;
            style_sheet += " }";
            params[k].btnColor ->setStyleSheet(style_sheet);
            break;
        }
}


вот важный элемент в коде заполнения:
connect(params[param_index].btnColor, SIGNAL(pressed()),
this, SLOT(btnColorClick()));
//// жирным выделен важный кусок кода, на который и следует обратить внимание

Автор: Litkevich Yuriy 11.4.2008, 18:54

глянь пример http://crossplatform.ru/documentation/qtdoc4.3/mainwindows-mdi.php, там, используется QSignalMapper, т.к. сигналы triggered() передают толко булевые значения, а впрограмме требуется узнать виджет.

Автор: AD 11.4.2008, 19:04

Цитата(Litkevich Yuriy @ 11.4.2008, 19:54) *
глянь пример http://crossplatform.ru/documentation/qtdoc4.3/mainwindows-mdi.php, там, используется QSignalMapper, т.к. сигналы triggered() передают толко булевые значения, а впрограмме требуется узнать виджет.

Спасибо. Попробую!

Автор: Litkevich Yuriy 11.4.2008, 19:08

тут у Шлее нашел еще, в его MDI, такой слот:

void MDIProgram::slotChangeWindowTitle(const QString& str)
{
    qobject_cast<DocWindow*>(sender())->setWindowTitle(str);
}

может это проще, отправителя узнать можно

Автор: Litkevich Yuriy 11.4.2008, 19:10

хе-хе, смотри пример Калкулятор, там слот один несколько кнопок обслуживает.

Автор: AD 11.4.2008, 19:54

Цитата(Litkevich Yuriy @ 11.4.2008, 20:10) *
хе-хе, смотри пример Калкулятор, там слот один несколько кнопок обслуживает.

Вообще супер. qobject_cast<>() - рулит. Очень удобно, практично и быстро реализовывается!!!

Спасибо! :)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)