Russian Qt Forum
Апреля 29, 2025, 00:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Повторение работы слота  (Прочитано 3560 раз)
Forix
Гость
« : Марта 11, 2013, 19:08 »

Добрый день, я новичек в Qt, пишу гуишную программу - Решение систем линейных уравнений методом Жордановых исключений, созданый слот для самого подсчета выполняется при нажатии кнопки продолжить, есть счетчик который считает количество нажатий, после второго нажатия слот подсчета выполняется дважды, в какую сторону копать решение?
Заранее благодарю.

Hider
Код:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
    
public:
    int n,m,k,k1; // n - колво строк, m - колво столбцов, k,k1 - счетчик(в дальнейшем будет использовано оба елемента).
    double a[4][5]; //для уравнений
    double a1[4][5]; //для решения
    double a2[4][5]; //для проверки
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    
private slots:
    void on_StartButton_clicked();

private:
    Ui::Widget *ui;
private slots:
    void zapoln();
    void resenie();
    void proverka_resh();
    void on_nextButton_clicked();
};

#endif // WIDGET_H

widget.cpp
Код:
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    n=4;
    m=5;
    k=0;
    k1=0;
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::zapoln(){
    a[0][0] = ui->cof_a_0_0->text().toDouble();
    a[0][1] = ui->cof_b_0_1->text().toDouble();
    a[0][2] = ui->cof_c_0_2->text().toDouble();
    a[0][3] = ui->cof_d_0_3->text().toDouble();
    a[0][4] = ui->cof_s_0_4->text().toDouble();

    a[1][0] = ui->cof_a_1_0->text().toDouble();
    a[1][1] = ui->cof_b_1_1->text().toDouble();
    a[1][2] = ui->cof_c_1_2->text().toDouble();
    a[1][3] = ui->cof_d_1_3->text().toDouble();
    a[1][4] = ui->cof_s_1_4->text().toDouble();

    a[2][0] = ui->cof_a_2_0->text().toDouble();
    a[2][1] = ui->cof_b_2_1->text().toDouble();
    a[2][2] = ui->cof_c_2_2->text().toDouble();
    a[2][3] = ui->cof_d_2_3->text().toDouble();
    a[2][4] = ui->cof_s_2_4->text().toDouble();

    a[3][0] = ui->cof_a_3_0->text().toDouble();
    a[3][1] = ui->cof_b_3_1->text().toDouble();
    a[3][2] = ui->cof_c_3_2->text().toDouble();
    a[3][3] = ui->cof_d_3_3->text().toDouble();
    a[3][4] = ui->cof_s_3_4->text().toDouble();

    for(int i=0; i<n; i++){
    for(int j=0; j<m; j++){
    a2[i][j] = a[i][j];
    }}

    for(int i=0,j=4; i<n; i++){
    a[i][j]*=-1;
    }

    for(int i=0; i<n; i++){
    for(int j=0; j<m; j++){
    a1[i][j] = a[i][j];
    }}

}

void Widget::on_StartButton_clicked()
{
    {
        ui->cof_a_0_0->setEnabled(0);
        ui->cof_a_1_0->setEnabled(0);
        ui->cof_a_2_0->setEnabled(0);
        ui->cof_a_3_0->setEnabled(0);
        ui->cof_b_0_1->setEnabled(0);
        ui->cof_b_1_1->setEnabled(0);
        ui->cof_b_2_1->setEnabled(0);
        ui->cof_b_3_1->setEnabled(0);
        ui->cof_c_0_2->setEnabled(0);
        ui->cof_c_1_2->setEnabled(0);
        ui->cof_c_2_2->setEnabled(0);
        ui->cof_c_3_2->setEnabled(0);
        ui->cof_d_0_3->setEnabled(0);
        ui->cof_d_1_3->setEnabled(0);
        ui->cof_d_2_3->setEnabled(0);
        ui->cof_d_3_3->setEnabled(0);
        ui->cof_s_0_4->setEnabled(0);
        ui->cof_s_1_4->setEnabled(0);
        ui->cof_s_2_4->setEnabled(0);
        ui->cof_s_3_4->setEnabled(0);
        ui->StartButton->setEnabled(0);
        ui->nextButton->setEnabled(1);
        QObject::connect(ui->nextButton, SIGNAL(clicked()), this, SLOT(zapoln()));

    }
}



void Widget::resenie(){
  k++; k1++;
  for(int i=0; i<n; i++){
  for(int j=0; j<m; j++){
    if(i!=k && j!=k1){
      a[i][j] = a1[k][k1]*a1[i][j] - a1[i][k1]*a1[k][j];
    } else {}
  }}

  for(int i=k, j=0; j<m; j++){
    a[i][j] *= -1;
  }

  a[k][k1] = 1;
  for(int i=0; i<n; i++){
    for(int j=0; j<m; j++){
      a[i][j] /= a1[k][k1];
    }}

    for(int i=0; i<n; i++){
      for(int j=0; j<m; j++){
        a1[i][j] = a[i][j];

      }}
}

void Widget::proverka_resh(){
    QString str;
    if(a2[0][m-1]*(-1) == a2[0][0]*a[0][m-1]+a2[0][1]*a[1][m-1]+a2[0][2]*a[2][m-1]+a2[0][3]*a[3][m-1]){
    ui->nextButton->setDisabled(1);
    for(int i=0, j = 4; i<n; i++){
        //str.append("X");
        //str.append(str.number(i));
        //str.append()
        //str.append(str.number(a[i][j]));
        str = QString().arg("X").arg(i).arg(" = ").arg(str.number(a[i][j]));
        ui->textEdit->setHtml(ui->textEdit->toHtml() + str);
        str.clear();
    }
    } else {
    ui->nextButton->setDisabled(1);
    ui->textEdit->setText("No variant.");
    }
}

void Widget::on_nextButton_clicked()
{
    if(k<4 && k1<4){
        QObject::connect(ui->nextButton, SIGNAL(pressed()), this, SLOT(resenie()));
} else {
        ui->nextButton->setDisabled(1);
        QObject::connect(ui->nextButton, SIGNAL(pressed()), this, SLOT(proverka_resh()));
    }
}

main.cpp
Код:
#include <QtGui/QApplication>
#include "widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    
    return a.exec();
}

код формы могу приложить при надобности.
Просьба откликнуться..
« Последнее редактирование: Марта 11, 2013, 20:35 от Forix » Записан
Bepec
Гость
« Ответ #1 : Марта 11, 2013, 19:28 »

Не смотрю на код, отвечаю наобум. Слот вызывается столько раз, сколько раз был произведён коннект со слотом.
2 раза соединил - 2 раза вызовется. Три раза - 3. Пять - 5.
Записан
Forix
Гость
« Ответ #2 : Марта 11, 2013, 19:42 »

Не смотрю на код, отвечаю наобум. Слот вызывается столько раз, сколько раз был произведён коннект со слотом.
2 раза соединил - 2 раза вызовется. Три раза - 3. Пять - 5.

В том то и дело, я нажимаю на кнопку первый раз - все нормально (1 конект - 1 выполнение), второй раз - два выполнения, третий - 1 выпонение, 4й - опять два)
это меня и тормозит)
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Марта 11, 2013, 19:49 »

не увидел в коде ни одного QObject::disconnect(). Если ты не делаешь disconnect(), то будут вызываться все слоты, которые соединял с помощью connect()
« Последнее редактирование: Марта 11, 2013, 19:50 от Alex Custov » Записан
Bepec
Гость
« Ответ #4 : Марта 11, 2013, 20:00 »

См. моё сообщение выше )

Проблема в том, что ты соединяешь КАЖДЫЙ раз. 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1. Возрастать будет Веселый 
Записан
Forix
Гость
« Ответ #5 : Марта 11, 2013, 20:10 »

вот оно чтооо..) перепишу - отпишусь) Смеющийся
Записан
Forix
Гость
« Ответ #6 : Марта 11, 2013, 20:34 »

точно) disconnect исправил положение)) спасибо) просто по шлее до него не дочитал еще)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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