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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [решено] Обращение к виджетам в main.cpp из mainwindow.cpp  (Прочитано 11537 раз)
HirurG.
Гость
« : Апреля 17, 2011, 18:04 »

В файле main.cpp описаны виджеты классов QLineEdit и QTableWidget При изменении значения в QLineEdit поступает сигнал в слот setRange(), описанный в mainwindow.cpp. Как в реализации этого сигнала изменить количество строк в QTableWidget?
Вот мой код:
main.cpp
Код:
#include <QtGui/QApplication>
#include <QtGui>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    int n = 3;

    MainWindow mainwindow;
    QWidget wgt;

    QHBoxLayout* phbxToolLayout = new QHBoxLayout;
    QVBoxLayout* pvbxLayout = new QVBoxLayout;

    QLabel* lblN = new QLabel("Vvedite razmernost' matrici");
    QLineEdit* leN = new QLineEdit;
    QPushButton* pbN = new QPushButton("Enter");
    QTableWidget tbl(n, n);

    QObject::connect(leN, SIGNAL(textChanged(QString)),
                     &mainwindow, SLOT(setRange(QString)));

    phbxToolLayout->addWidget(lblN);
    phbxToolLayout->addWidget(leN);
    phbxToolLayout->addWidget(pbN);
    pvbxLayout->addLayout(phbxToolLayout);
    pvbxLayout->addWidget(&tbl);

    wgt.setLayout(pvbxLayout);
    wgt.show();
    mainwindow.setCentralWidget(&wgt);
    mainwindow.show();

    return a.exec();
}
mainwindow.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QObject>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;

public slots:
    void setRange(QString);
};

#endif // MAINWINDOW_H
mainwindow.cpp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

void MainWindow::setRange(QString strN)
{
    tbl.setRowCount(strN);
}

MainWindow::~MainWindow()
{
    delete ui;
}
В строчке
Код:
tbl.setRowCount(strN);
выдаёт ошибку
/home/.../mainwindow.cpp:14: error: ‘tbl’ was not declared in this scope
« Последнее редактирование: Апреля 18, 2011, 06:03 от HirurG. » Записан
alexman
Гость
« Ответ #1 : Апреля 17, 2011, 18:14 »

Так где у вас tbl объявлено?
Записан
HirurG.
Гость
« Ответ #2 : Апреля 17, 2011, 18:16 »

Так где у вас tbl объявлено?
tbl объявлено в main.cpp, в 20-й строке
Записан
blood_shadow
Гость
« Ответ #3 : Апреля 17, 2011, 18:22 »

mainwindow.h и mainwindow.cpp  - первая единица компиляции
main.cpp и mainwindow.h - вторая единица компиляции
ты определил tbl в одной единице компиляции, а пытаешься использовать в другой,
попросту говоря, ф-ция:

Код:
void MainWindow::setRange(QString strN)
{
    tbl.setRowCount(strN);
}

ничего незнает о tbl, который определен в main.cpp и к тому же tbl - локальная переменная,
видимая только в блоке с открывающей скобкой и до закрывающей,
короче чтобы можно было изменять количество столбцов с главного окна, ему нужно
передать указатель или ссылку на этот QTableWidget, хотя мне кажется что QTableWidget
можно сделать членом класса MainWindow если они логически связанны, и не требуется отдельно
его использовать
Записан
HirurG.
Гость
« Ответ #4 : Апреля 17, 2011, 18:31 »

... чтобы можно было изменять количество столбцов с главного окна, ему нужно
передать указатель или ссылку на этот QTableWidget, хотя мне кажется что QTableWidget
можно сделать членом класса MainWindow если они логически связанны, и не требуется отдельно
его использовать
как мне этот указатель или ссылку прописать? а то я уже перепробовал всё что мог, но не получилось
Записан
alexman
Гость
« Ответ #5 : Апреля 17, 2011, 18:36 »

Может стоит таблицу в MainWindow хранить/создавать...
Записан
blood_shadow
Гость
« Ответ #6 : Апреля 17, 2011, 18:42 »

header
Код
C++ (Qt)
#include <QTableWidget>
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
 
private:
   Ui::MainWindow *ui;
   QTableWidget tbl(n, n);
 
public slots:
   void setRange(QString);
};

с меин убрать QTableWidget tbl(n, n);
поставить вместо (n, n) размерность или создавать пустую таблицу,
а потом через ф-цию менять ее размерность
Записан
HirurG.
Гость
« Ответ #7 : Апреля 17, 2011, 18:50 »

Может стоит таблицу в MainWindow хранить/создавать...
если компоненты хранить/создавать в MainWindow, то вообще пустое окно появляется
например:
main.cpp
Код:
#include <QtGui/QApplication>
#include <QtGui>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow mainwindow;
    mainwindow.show();

    return a.exec();
}
mainwindow.cpp
Код:
#include <QtGui>
#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    int n = 3;

    QWidget wgt;

    QHBoxLayout* phbxToolLayout = new QHBoxLayout;
    QVBoxLayout* pvbxLayout = new QVBoxLayout;

    QLabel* lblN = new QLabel("Vvedite razmernost' matrici");
    QLineEdit* leN = new QLineEdit;
    QPushButton* pbN = new QPushButton("Enter");
    QTableWidget tbl(n, n);

    QObject::connect(leN, SIGNAL(textChanged(QString)), SLOT(setRange(QString)));

    phbxToolLayout->addWidget(lblN);
    phbxToolLayout->addWidget(leN);
    phbxToolLayout->addWidget(pbN);
    pvbxLayout->addLayout(phbxToolLayout);
    pvbxLayout->addWidget(&tbl);

    wgt.setLayout(pvbxLayout);
    wgt.show();
    setCentralWidget(&wgt);

    ui->setupUi(this);
}

void MainWindow::setRange(QString strN)
{
    //tbl.setRowCount(strN);
}

MainWindow::~MainWindow()
{
    delete ui;
}
Записан
blood_shadow
Гость
« Ответ #8 : Апреля 17, 2011, 19:08 »

1. setupUi(this) делается в самом начале конструктора
2. QTableWidget tbl(n, n); - ты его сделал локальным членом, таблица существует
только в конструкторе, сделай объявление таблицы как я писал выше в объявлении класса
внутри же класса таблицу просто используй по имени tbl

метод
Код:
void MainWindow::setRange(QString strN)
{
    //tbl.setRowCount(strN);
}

незнает что такое tbl, так как таблица локальна в конструкторе
Записан
HirurG.
Гость
« Ответ #9 : Апреля 17, 2011, 19:23 »

1. setupUi(this) делается в самом начале конструктора
2. QTableWidget tbl(n, n); - ты его сделал локальным членом, таблица существует
только в конструкторе, сделай объявление таблицы как я писал выше в объявлении класса
внутри же класса таблицу просто используй по имени tbl
я что-то не понял, как в заголовочном файле надо прописать?
« Последнее редактирование: Апреля 17, 2011, 19:45 от HirurG. » Записан
blood_shadow
Гость
« Ответ #10 : Апреля 17, 2011, 19:46 »

Код
C++ (Qt)
#include <QTableWidget>
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
 
private:
   Ui::MainWindow *ui;
   QTableWidget tbl(3, 3);
 
public slots:
   void setRange(QString);
};
 

в конструкторе используешь по имени таблицу

Код
C++ (Qt)
#include <QtGui>
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
   QWidget wgt;
 
   QHBoxLayout* phbxToolLayout = new QHBoxLayout;
   QVBoxLayout* pvbxLayout = new QVBoxLayout;
 
   QLabel* lblN = new QLabel("Vvedite razmernost' matrici");
   QLineEdit* leN = new QLineEdit;
   QPushButton* pbN = new QPushButton("Enter");
 
   QObject::connect(leN, SIGNAL(textChanged(QString)), SLOT(setRange(QString)));
 
   phbxToolLayout->addWidget(lblN);
   phbxToolLayout->addWidget(leN);
   phbxToolLayout->addWidget(pbN);
   pvbxLayout->addLayout(phbxToolLayout);
   pvbxLayout->addWidget(&tbl);
 
   wgt.setLayout(pvbxLayout);
   wgt.show();
   setCentralWidget(&wgt);
 
}
 
void MainWindow::setRange(QString strN)
{
   tbl.setRowCount(strN);
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 

примерно так
Записан
HirurG.
Гость
« Ответ #11 : Апреля 17, 2011, 19:59 »

 Непонимающий значит я тебя правильно понял. просто теперь строка
Код:
QTableWidget tbl(3, 3);
вызывает две ошибки: mainwindow.h:22: error: expected identifier before numeric constant
mainwindow.h:22: error: expected ‘,’ or ‘...’ before numeric constant
Записан
blood_shadow
Гость
« Ответ #12 : Апреля 17, 2011, 20:02 »

прикрепи свой проект, я как вернусь посмотрю
Записан
HirurG.
Гость
« Ответ #13 : Апреля 17, 2011, 20:10 »

вот архив проекта
Записан
blood_shadow
Гость
« Ответ #14 : Апреля 17, 2011, 22:27 »

все поправил
самое больше что мне не понравилось это твои имена переменных, уж очень они не очевидные
посмотри на то как тролли обзивают свои переменные, попробуй в том духе
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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