Название: [РЕШЕНО] Повторение работы слота
Отправлено: 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(); }
код формы могу приложить при надобности. Просьба откликнуться..
Название: Re: Повторение работы слота
Отправлено: Bepec от Марта 11, 2013, 19:28
Не смотрю на код, отвечаю наобум. Слот вызывается столько раз, сколько раз был произведён коннект со слотом. 2 раза соединил - 2 раза вызовется. Три раза - 3. Пять - 5.
Название: Re: Повторение работы слота
Отправлено: Forix от Марта 11, 2013, 19:42
Не смотрю на код, отвечаю наобум. Слот вызывается столько раз, сколько раз был произведён коннект со слотом. 2 раза соединил - 2 раза вызовется. Три раза - 3. Пять - 5.
В том то и дело, я нажимаю на кнопку первый раз - все нормально (1 конект - 1 выполнение), второй раз - два выполнения, третий - 1 выпонение, 4й - опять два) это меня и тормозит)
Название: Re: Повторение работы слота
Отправлено: Alex Custov от Марта 11, 2013, 19:49
не увидел в коде ни одного QObject::disconnect(). Если ты не делаешь disconnect(), то будут вызываться все слоты, которые соединял с помощью connect()
Название: Re: Повторение работы слота
Отправлено: Bepec от Марта 11, 2013, 20:00
См. моё сообщение выше )
Проблема в том, что ты соединяешь КАЖДЫЙ раз. 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1. Возрастать будет :D
Название: Re: Повторение работы слота
Отправлено: Forix от Марта 11, 2013, 20:10
вот оно чтооо..) перепишу - отпишусь) ;D
Название: Re: Повторение работы слота
Отправлено: Forix от Марта 11, 2013, 20:34
точно) disconnect исправил положение)) спасибо) просто по шлее до него не дочитал еще)
|