Обращение к tableView в дочерней форме
Не удается обратиться к tableView созданной формы, ошибка:
no member named 'tableView' in 'FoodMainForm'.
В главном окне MainWindow есть кнопка:
Файл mainwindow.cpp:
void MainWindow::on_pushButton_clicked()
{
food_form = new FoodMainForm();
food_form->show();
food_form->tableView->setModel(model);
}
Форма FoodMainForm:
Ответы (2 шт):
Автор решения: Sergey Tatarincev
→ Ссылка
у вас два варианта: неправильно-некрасиво и правильно:
- Сделать ui в FoodMainForm публичным (работать будет, но это нежелательно)
- Все взаимодействие производить через сигналы-слоты. При этом вся логика дочернего окна должна быть именно в его классе
Автор решения: Sergey Tatarincev
→ Ссылка
В вопросе не указано что за модель в tableView. Будем считать что QSqlTableView
Взаимодействите на минималках. В ui MainWindow закинут textEdit, куда будем логгировать выбор ячейки tableView в диалоге:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlError>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
private slots:
// В этот слот будем принимать инфу что пользователь выбрал ячейку таблицы
void dialogIndexSelected(int row,int col, QString val);
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mydialog.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("database.db3");
if(!db.open())
qDebug()<<db.lastError();
// Создали объект формы диалога
myDialog* dlg = new myDialog();
// Когда диалог будет пулять сигнал выбора ячейки, обработаем в нашем слоте
connect(dlg,SIGNAL(indexSelected(int,int,QString)),this,SLOT(dialogIndexSelected(int,int,QString)));
// покажем окно диалога
dlg->show();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::dialogIndexSelected(int row, int col, QString val)
{
// добавим в textEdit запись о том что выбрал пользователь
ui->textEdit->append(QString("user was select item at row=%1, col=%2 with text='%3'").arg(row).arg(col).arg(val));
}
mydialog.h
#ifndef MYDIALOG_H
#define MYDIALOG_H
#include <QDialog>
#include <QSqlQuery>
#include <QSqlResult>
#include <QSqlTableModel>
namespace Ui {
class myDialog;
}
class myDialog : public QDialog
{
Q_OBJECT
public:
explicit myDialog(QWidget *parent = 0);
~myDialog();
private slots:
// слот для сигнала, когда пользователь кликнул по ячейке
void on_tableView_clicked(const QModelIndex &index);
signals:
// Такой сигналформа будет пулять когда пользователь выбрал ячейку
void indexSelected(int row,int col, QString val);
private:
Ui::myDialog *ui;
};
#endif // MYDIALOG_H
mydialog.cpp
#include "mydialog.h"
#include "ui_mydialog.h"
myDialog::myDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::myDialog)
{
ui->setupUi(this);
// Как я и говорил вся логика должна остаться в диалоге. Создадим модель, и настроим все остальное если надо
QSqlTableModel* model = new QSqlTableModel();
ui->tableView->setModel(model);
model->setTable("TEST");
model->select();
}
myDialog::~myDialog()
{
delete ui;
}
// когда пользователь кликнул на ячейке
void myDialog::on_tableView_clicked(const QModelIndex &index)
{
// эмитим сигнал в который передаем строку,столбец и текст выбранной ячейки
emit indexSelected(index.row(),index.column(),index.data().toString());
}
