Russian Qt Forum
Ноябрь 23, 2024, 11:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача значений  (Прочитано 4446 раз)
Snegovikufa
Гость
« : Декабрь 10, 2009, 19:23 »

Пишу программу, которая считывает из файла значения, и по ним составляет расписание. В одной форме выводится непосредственно расписание на текущий день, а во второй форме хочу сделать мини-редактор для расписания.

При создании первой формы происходит считывание из необходимого файла. Нужно считанные значения передать во вторую форму (точнее в таблицу, но это сейчас не важно).
Ну вот к примеру таким образом:
Код:
int i = Calendar::i;

Но вот считать значения переменных из 1 исходного файла не получается. Видимо из-за того, что файл еще не считан и в переменных отсутствуют значения. Надеюсь, я объяснил понятно.
Так вот, можно ли сделать какую-нибудь задержку перед присваиванием или я просто что-то не так делаю?  Непонимающий
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Декабрь 10, 2009, 19:26 »

Кода мало. Как создается Calendar, почему Calendar::i статическая, где создается 2й класс?
Записан
Snegovikufa
Гость
« Ответ #2 : Декабрь 10, 2009, 19:39 »

Содержимое calendar.h
Код:
class Calendar: public QMainWindow
{
    Q_OBJECT

public:
    Calendar();
    int i;
    QList<QString> tableweek,tableday,tablenum,tablename;
public slots:
    void raspisanie(QDate);
    void setCurrDay(QDate);
private:
    void insertDate();
    bool ok;
    QDate selectedDate,firstDate;
    QTextBrowser *editor;
    int cur_week;
    QCalendarWidget * monthcalendar;
};
Содержимое calendar.cpp
Код:
#include "calendar.h"
#include <QtGui>
#include <QFile>
#include <QTextCodec>
Calendar::Calendar()
{
    // тут был кусок кода
    QFile file("db.ini");
    if (!file.open(QIODevice::ReadWrite | QIODevice::Text))
         editor->insertPlainText(tr("Файл не существует"));
    QTextStream filein(&file);
    QString line = filein.readLine();
    QList<QString> list2 = line.split(" ", QString::SkipEmptyParts);
    int mf,yf,df;
    df = list2[0].toInt(&ok,10);
    mf = list2[1].toInt(&ok,10);
    yf = list2[2].toInt(&ok,10);
    firstDate = QDate(yf,mf,df);
    i=0;
    while (!filein.atEnd()) {
         line = filein.readLine();
         list2 = line.split(" ", QString::SkipEmptyParts);
         tableweek.append(list2[0]);
         tableday.append(list2[1]);
         tablenum.append(list2[2]);
         tablename.append(list2[3]);
         i++;
     }
    file.close();
Содержание table.h
Код:
class Table: public QMainWindow
{
    Q_OBJECT

public:
    Table();
public slots:
private:
    QTreeWidget* table;
};
Содержание table.cpp
Код:
#include <QtGui>
#include <QFile>
#include "table.h"
#include "calendar.h"
Table::Table(){
    QTextCodec::setCodecForTr(QTextCodec::codecForName("CP1251"));
    table = new QTreeWidget();
    table->setColumnCount(4);
    table->setHeaderLabel(tr("Неделя"));
    int i = Calendar::i;
    QVBoxLayout * layout = new QVBoxLayout;
    layout->addWidget(table);
    QWidget *widget = new QWidget;
    setCentralWidget(widget);
    widget->setLayout(layout);
}
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Декабрь 10, 2009, 19:58 »

мои познаняия в с++ говорят о том, что строка int i = Calendar::i; компилироваться не будет
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Декабрь 10, 2009, 20:14 »

Код:
if (!file.open(QIODevice::ReadWrite | QIODevice::Text))
       editor->insertPlainText(tr("Файл не существует"));
QTextStream filein(&file);
Подозрительные флаги открытия. Имеет смысл проверить
Код:
if (!file.open(QIODevice::ReadOnly)) {
       editor->insertPlainText(tr("Файл не существует"));
       return;
}
QTextStream filein(&file);
Такая конструкция точно работает
Записан
Snegovikufa
Гость
« Ответ #5 : Декабрь 10, 2009, 20:26 »

мои познаняия в с++ говорят о том, что строка int i = Calendar::i; компилироваться не будет
Это я уже и так понял. Вот как решить данную проблему?  Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Декабрь 10, 2009, 20:31 »

создавать экземпляр класса Calendar в тейбл. Передать указатель на Calendar в класс Table. Сделать кучу сигналов/слотов. Я бы делал по 1му варианту - прятал 1ю форму, создавал 2ю, ставил значения, показывал. Если нужны обе формы одновременно, то 2е. Можно через сигналы/слоты, но некрасиво оно.
Можно ввести еще 3й класс, доступный обоим, хранящий значения (это в случае когда значения хранятся долго - нечто типа настроек приожения)
Записан
Snegovikufa
Гость
« Ответ #7 : Декабрь 10, 2009, 20:35 »

Ладно, похоже проще написать редактор отдельным приложением  Улыбающийся

Также, я продумывл конечно вариант такой: 1 класс считывает, закрывает файл, затем считывает 2 класс и уже непосредственно сохраняет. Но только вот мне кажется это изобретение велосипеда. Да и не нужно...

Во, еще одна идея пришла в голову. Если завести еще 1 переменную в 1 классе и в ней держать значение "0" пока файл не считан и "1" если уже считан и закрыт. Во 2 классе реализовать цикл ожидания, пока не появится "1". Хм, даже не знаю получится или нет  Улыбающийся
« Последнее редактирование: Декабрь 10, 2009, 20:43 от Snegovikufa » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Декабрь 10, 2009, 20:48 »

Код:
class Calendar;
class Table : public QMainWindow
{
Calendar * cal;
Table()
{
    cal = new Calendar();
    int i = cal->i;
}
}
схематично так. Можно сделать не указатель, а член класса, это уже на твой выбор
« Последнее редактирование: Декабрь 10, 2009, 20:51 от Авварон » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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