Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вызвать слот из другого класса
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
lexflax
Доброго времени суток.
Подскажите как вызвать слот из класса class MainWindow1, после нажатия кнопки в классе class Addnomenklatura.
#ifndef MAINWINDOW1_H
#define MAINWINDOW1_H
#include <QtSql/QSqlTableModel>
#include <QMainWindow>
#include "mainwindow.h"
#include "ui_mainwindow.h"
namespace Ui {
class MainWindow1;
}

class MainWindow1 : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow1(QWidget *parent = 0);
    ~MainWindow1();

private slots:
    void on_pushButton_clicked();
void prostoSlot();
    void on_pushButton_2_clicked();

private:
    Ui::MainWindow1 *ui;
QSqlQueryModel *nomenclatura;

};


#include "mainwindow1.h"
#include "ui_mainwindow1.h"
#include "Addnomenklatura.h"
#include "ui_Addnomenklatura.h"
#include <QtSql/QSqlTableModel>
#include <QTableView>
#include <QtSql/QSqlError>
#include <QtSql/QSqlRecord>
#include <QMessageBox>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QSqlQuery>
MainWindow1::MainWindow1(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow1)
{
    ui->setupUi(this);

    QSqlQueryModel *nomenclatura = new QSqlQueryModel;
    QSqlQuery query;
    query.exec("SELECT * FROM nomenklatura");
    nomenclatura->setQuery(query);
    ui->tableView->setModel(nomenclatura);

}

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

void MainWindow1::on_pushButton_clicked()
{
    Addnomenklatura *n1 = new  Addnomenklatura;
    n1->show();

}

void MainWindow1::on_pushButton_2_clicked()
{

}
void MainWindow1:: prostoSlot() Этот слот нужно вызвать!!!!!
{

        QMessageBox::information(NULL,QObject::tr("Информация"),tr("Слот вызван"));
        QSqlQueryModel *nomenclatura = new QSqlQueryModel;
        QSqlQuery query;
        query.exec("SELECT * FROM nomenklatura");
        nomenclatura->setQuery(query);
        ui->tableView->setModel(nomenclatura);

}

#ifndef ADDNOMENKLATURA_H
#define ADDNOMENKLATURA_H
#include <QtSql/QSqlTableModel>
#include <QMainWindow>
#include "mainwindow1.h"
#include "ui_mainwindow1.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
namespace Ui {
class Addnomenklatura;
}
class Addnomenklatura : public QMainWindow
{
    Q_OBJECT

public:
    explicit Addnomenklatura(QWidget *parent = 0);
    ~Addnomenklatura();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::Addnomenklatura *ui;
};

#endif // ADDNOMENKLATURA_H


#include "addnomenklatura.h"
#include "ui_addnomenklatura.h"
#include <QtSql/QSqlRecord>
#include "mainwindow1.h"
#include "ui_mainwindow1.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QSqlQuery>
Addnomenklatura::Addnomenklatura(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Addnomenklatura)
{
    ui->setupUi(this);

connect(ui->pushButton,SIGNAL(clicked()),?,SLOT(prostoSlot())); думал как соединить сигнал со слотом... но не пришел к правильному варианту
}

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

void Addnomenklatura::on_pushButton_clicked() После нажатия этой кнопки должен вызваться слот!!!
{

    QSqlQuery query;
           query.prepare("INSERT INTO  nomenklatura (id_n,kod_pozicii,name_pozicii,cena) VALUES ( :id_n,:kod_pozicii,:name_pozicii,:cena)");
           query.bindValue(":id_n", ui->lineEdit->text());
           query.bindValue(":kod_pozicii", ui->lineEdit->text());
           query.bindValue(":name_pozicii", ui->lineEdit->text());
           query.bindValue(":cena", ui->lineEdit->text());
           query.exec();

this->close();

}

void Addnomenklatura::on_pushButton_2_clicked()
{
   this->close();
}
Trisch
как то так:
void MainWindow1::on_pushButton_clicked()
{
    Addnomenklatura *n1 = new  Addnomenklatura;
    connect(n1, SIGNAL(сигнал()), this, SLOT(слот()));
    n1->show();

}
lexflax
Цитата(Trisch @ 17.12.2014, 18:04) *
как то так:
void MainWindow1::on_pushButton_clicked()
{
    Addnomenklatura *n1 = new  Addnomenklatura;
    connect(n1, SIGNAL(сигнал()), this, SLOT(слот()));
    n1->show();

}

возможно я не правильно понимаю, но нужно чтоб после нажатия кнопки на форме
void Addnomenklatura::on_pushButton_clicked()
вызывался слот а вы указываете
void MainWindow1::on_pushButton_clicked()

все понял)))
void MainWindow1::on_pushButton_clicked()
{
    Addnomenklatura *n1 = new  Addnomenklatura;
        connect(n1, SIGNAL(pushButton()), this, SLOT(prostoSlot()));
     n1->show();
}

Но теперь программа завершается крахом((( в чем может быть причина?(

в системе отладчика пишет
Приложение остановлено, так как оно получило сигнал от операционной системы.

Сигнал:
SIGSEGV
Назначение:
Segmentation fault


теперь другая беда
void MainWindow1::on_pushButton_clicked()
void MainWindow1::on_pushButton_clicked()
{
    Addnomenklatura *n1 = new  Addnomenklatura;
        connect(n1, SIGNAL(pushButton()), this, SLOT(prostoSlot()));
     n1->show();
}

не вызывает слот пишет
QObject::connect: No such signal Addnomenklatura::on_pushButton_clicked() in ..\one\mainwindow1.cpp:39
QObject::connect: (sender name: 'Addnomenklatura')
QObject::connect: (receiver name: 'MainWindow1')
Trisch
Цитата(lexflax @ 17.12.2014, 19:45) *
Но теперь программа завершается крахом((( в чем может быть причина?(


При каких условиях программа падает?

Цитата(lexflax @ 17.12.2014, 19:45) *
не вызывает слот пишет
QObject::connect: No such signal Addnomenklatura::on_pushButton_clicked() in ..\one\mainwindow1.cpp:39
QObject::connect: (sender name: 'Addnomenklatura')
QObject::connect: (receiver name: 'MainWindow1')


наверное, нет такого сигнала. Подробнее о сигналах и слотах тут
lexflax
Цитата(Trisch @ 17.12.2014, 22:34) *
Цитата(lexflax @ 17.12.2014, 19:45) *
Но теперь программа завершается крахом((( в чем может быть причина?(


При каких условиях программа падает?

Цитата(lexflax @ 17.12.2014, 19:45) *
не вызывает слот пишет
QObject::connect: No such signal Addnomenklatura::on_pushButton_clicked() in ..\one\mainwindow1.cpp:39
QObject::connect: (sender name: 'Addnomenklatura')
QObject::connect: (receiver name: 'MainWindow1')


наверное, нет такого сигнала. Подробнее о сигналах и слотах тут


Я добавил сигнал и слот вызывается, но проблема в другом, не обновляется tableview, подскажите что в данному случае делаю не так, в слоте как раз и есть обновление...
Сам слот
[/code]void MainWindow1:: prostoSlot()
{


        QMessageBox::information(NULL,QObject::tr("Информация"),tr("Слот вызван"));
        QSqlQueryModel *nomenclatura = new QSqlQueryModel;
        QSqlQuery query;
        query.exec("SELECT * FROM nomenklatura");
        nomenclatura->setQuery(query);
        ui->tableView->setModel(nomenclatura);


}
mainwindow1.cpp
[code]
#include "mainwindow1.h"
#include "ui_mainwindow1.h"
#include "Addnomenklatura.h"
#include "ui_Addnomenklatura.h"
#include <QtSql/QSqlTableModel>
#include <QTableView>
#include <QtSql/QSqlError>
#include <QtSql/QSqlRecord>
#include <QMessageBox>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QSqlQuery>
MainWindow1::MainWindow1(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow1)
{
    ui->setupUi(this);

    QSqlQueryModel *nomenclatura = new QSqlQueryModel;
    QSqlQuery query;
    query.exec("SELECT * FROM nomenklatura");
    nomenclatura->setQuery(query);
    ui->tableView->setModel(nomenclatura);





}

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

void MainWindow1::on_pushButton_clicked()
{
    Addnomenklatura *n1 = new  Addnomenklatura;
        connect(n1, SIGNAL(mySignal()), this, SLOT(prostoSlot()));
     n1->show();
}

void MainWindow1::on_pushButton_2_clicked()
{

}
void MainWindow1:: prostoSlot()
{


        QMessageBox::information(NULL,QObject::tr("Информация"),tr("Слот вызван"));
        QSqlQueryModel *nomenclatura = new QSqlQueryModel;
        QSqlQuery query;
        query.exec("SELECT * FROM nomenklatura");
        nomenclatura->setQuery(query);
        ui->tableView->setModel(nomenclatura);


}

Addnomenklatura.cpp
#include "addnomenklatura.h"
#include "ui_addnomenklatura.h"
#include <QtSql/QSqlRecord>
#include "mainwindow1.h"
#include "ui_mainwindow1.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QSqlQuery>
Addnomenklatura::Addnomenklatura(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Addnomenklatura)
{
    ui->setupUi(this);



}

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

void Addnomenklatura::on_pushButton_clicked()
{
emit mySignal();
    QSqlQuery query;
           query.prepare("INSERT INTO  nomenklatura (id_n,kod_pozicii,name_pozicii,cena) VALUES ( :id_n,:kod_pozicii,:name_pozicii,:cena)");
           query.bindValue(":id_n", ui->lineEdit->text());
           query.bindValue(":kod_pozicii", ui->lineEdit->text());
           query.bindValue(":name_pozicii", ui->lineEdit->text());
           query.bindValue(":cena", ui->lineEdit->text());
           query.exec();

this->close();


}

void Addnomenklatura::on_pushButton_2_clicked()
{
   this->close();
}
Trisch
Цитата(lexflax @ 18.12.2014, 15:10) *
Я добавил сигнал и слот вызывается, но проблема в другом, не обновляется tableview, подскажите что в данному случае делаю не так, в слоте как раз и есть обновление...


А почему он должен обновляться? У вас меняются данные в базе?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.