Оператор подключения Qt

Я хочу улучшить свой код, который работает, но мне это не удается, и моя проблема заключается в том, как правильно передавать аргументы, я имею в виду:

void pracownik2::on_pushButton_4_clicked(){

this->setWindowTitle("EKRAN");
QWidget *centralWidget = new QWidget;
        int licznik=1;
        QString licz;
        //QString kolumny = ui->lineEdit->text();
        //QString wiersze = ui->lineEdit_2->text();
        miejsca2 = ui->lineEdit_3->text().toInt();
        //QPushButton *button[wiersze.toInt()][kolumny.toInt()];
        QPushButton *button[3][6];

        QGridLayout *controlsLayout = new QGridLayout;
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<6;j++)
            {
                    licz = QString::number(licznik);
                    licznik++;
                    button[i][j] = new QPushButton(licz);
                    button[i][j]->setCheckable(1);
                        if(tab[i][j]==1)
                            button[i][j]->setEnabled(false);
                    controlsLayout->addWidget(button[i][j], i, j);
            }
        }

        QPushButton *okej = new QPushButton("Zatwierdź");
        QPushButton *anul = new QPushButton("Anuluj");

        controlsLayout->addWidget(okej, 3, 0);
        controlsLayout->addWidget(anul, 3, 1);

        controlsLayout->setHorizontalSpacing(0);
        controlsLayout->setVerticalSpacing(0);
        centralWidget->setLayout(controlsLayout);

        setCentralWidget(centralWidget);



        for(int i=0;i<3;i++)
        {
            for(int j=0;j<6;j++)
            {
                    connect(button[i][j],SIGNAL(toggled(bool)),this,SLOT(tescik(bool)));
            }
        }



        connect(anul,SIGNAL(clicked()),this,SLOT(close()));

        connect(okej,SIGNAL(clicked()),this,SLOT(okay2()));}

void pracownik2::tescik(bool t){
if (t)
{
    miejsca++;
}
else
{
    miejsca--;
}}

Это работает до сих пор, и я хочу, чтобы функция «tescik» также устанавливала значения моего массива:

void pracownik2::tescik(bool t, int i, int j){
if (t)
{tab[i][j]=1;
    miejsca++;
}
else
{tab[i][j]=0;
    miejsca--;
}}

Я не могу передать индексы «i» и «j» текущей кнопки qpushbutton, и я понятия не имею, как редактировать мою строку подключения

connect(button[i][j],SIGNAL(toggled(bool)),this,SLOT(tescik(bool,int,int)));

он до сих пор понятия не имеет, что я имею в виду под int, int, и я до сих пор не знаю, как заставить его работать :)


person CentusDBWA    schedule 24.01.2015    source источник
comment
Вы не можете соединить СИГНАЛЫ и СЛОТЫ с разными сигнатурами. Вы можете расширить QPushButton и предоставить собственный сигнал, если вы действительно хотите сделать это таким образом.   -  person doc    schedule 24.01.2015
comment
Пожалуйста, не публикуйте свой вопрос снова, просто измените предыдущий. Дубликат stackoverflow.com/questions/28125466/   -  person doc    schedule 24.01.2015
comment
@doc, На самом деле вы можете. Например, вы можете сделать что-то вроде этого: connect(sender, SIGNAL(signalWithThreeArgs(bool, int, int)), reciever, SLOT(slotWIthOneArg(bool)))   -  person Mikhail Zimka    schedule 24.01.2015
comment
@MikhailZimka А, верно. Я забываю об этом. Таким образом, сигнал должен предоставлять не меньше аргументов, чем слот, и их типы должны совпадать.   -  person doc    schedule 24.01.2015


Ответы (1)


Ваша проблема связана с несоответствием аргументов при попытке соединить сигнал и слот (сигнал выдается только с одним boolvalue, когда слот занимает три) - вы должны получить соответствующее сообщение в выводе вашего приложения. Одним из решений является использование динамических свойств QObject. Вы можете сделать что-то подобное при создании кнопок:

button[i][j] = new QPushButton(licz);  
button[i][j]->setProperty("i", i);  
button[i][j]->setProperty("j", j);

И после этого вы можете переписать свой слот:

void pracownik2::tescik(bool t) {
int i = QObject::sender()->property("i").toInt();  
int j = QObject::sender()->property("j").toInt();
if (t)  
{tab[i][j]=1;  
    miejsca++;  
}  
else  
{tab[i][j]=0;  
    miejsca--;  
}}
person Mikhail Zimka    schedule 24.01.2015