Где и как описываются глобальные переменные в QT?

Изображение пользователя Condor.

При написании кода в QT Creator мне надо объявить глобальную переменную, чтобы была доступна во всех подпрограммах.
Как это можно сделать?

+2
RavenS - 1 Август, 2009 - 08:18
Изображение пользователя RavenS.

Определяете в одном из .h файлов переменную типа static, если статических переменных много, можно определить в классе (someClass::staticVariable), затем подключаете этот заголовочный файл в других, и используете.

someClass.h:

class someClass
{
static int var1;
static double var2;
}

---
otherClass.cpp:
#include "someClass.h"

someClass::var1 = 5;
someClass::var2 = someClass::var1 / 2.0;

А вообще, глобальные переменные - плохая практика. Лучше передавайте переменные в качестве аргумента.

-3
Condor - 2 Август, 2009 - 20:16
Изображение пользователя Condor.

Блин, ну не могут быть по-человечески реализованы такие простые вещи...
Чтобы создать переменную, необходимо создать файл с описанием класса, описать там создаваемую переменную и обращаться к этой переменной через имя класса...
Как-то уже скучаю по си для доса...
Гораздо всё было продуманнее и стройнее...
А за помощь, огромное спасибо, до такого бреда от разработчиков, сам бы не додумался!
Буду заниматься втыканием бредового кода наиудобнейшем программированием под линукс.

0
Soi-Fong - 2 Август, 2009 - 22:17
Изображение пользователя Soi-Fong.

Не понял, чем отличается программирование на Qt от программирования на Cи? Си является подмножеством Си++, Си++ он и в Qt под линукс Си++.

+1
linuxevolution - 1 Сентябрь, 2009 - 13:57
Изображение пользователя linuxevolution.

Тем что на С++ тебе надо писать собственный класс чего-то-там и у бивать время на его реализацию и тестинг. Под Qt уже реализовано довольно много разного рода контролов и класов для работы начиная от текста до штмл и т.д. что резко во много раз сокращает разработку софта. Темболее написаная СНАЧАЛО на линуксе прога на Qt, очень успешно компилится на платформе Виндовс, а не наоборот. Сколько нитья на многих форумах от некоторых программистов о том что написал софт под винду, а потом компилил на линуксе и оно неработает, а потомучто(и очень многие это пишут), еще раз повторюсь надо сначала создать софтину на Линуксе, а потом портировать на другие системы, и на крайняк уже дотачивать если нужно. Ведь нет ничего идеально работающего ;)
И если опять возникает тот же вопрос "чем отличается", ничем, это и есть С++ в очень расширенном варианте ;), как бы образно выражаясь.

+1
ploop - 1 Сентябрь, 2009 - 14:32
Изображение пользователя ploop.

Темболее написаная СНАЧАЛО на линуксе прога на Qt, очень успешно компилится на платформе Виндовс, а не наоборот.
Одновременно работал с проектом под Linux и под XP, тупо таская его на флэшке. При чем начинал на XP. Проблем с компиляцией никаких. Надо только очистить его от уже скомпилированных объектных файлов. ЧЯНТД?

Чтобы создать переменную, необходимо создать файл с описанием класса, описать там создаваемую переменную и обращаться к этой переменной через имя класса...
И это правильно. Глобальные переменные в языке, ориентированном на ООП - зло!

0
linuxevolution - 1 Сентябрь, 2009 - 14:53
Изображение пользователя linuxevolution.

С кодировкой под виндой тоже никаких проблем небыло? Особенно с кирилицей? ;)

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

0
ploop - 1 Сентябрь, 2009 - 15:03
Изображение пользователя ploop.

Нет.
1. Нужно в свойствах проекта указать, в какой кодировке будут исходники. По умолчанию стоит системная, а в win и linux она разная...

2. Если нужно вывести текст, указанный прямо в коде, то указываем fromВыбраннаяКодировка. Желательно еще добавлять tr() - проблем с переводом меньше будет.

И всё :)

0
Condor - 2 Сентябрь, 2009 - 16:35
Изображение пользователя Condor.

Это зло, если не контролируешь переменные.
А мне надо всего ОДНУ глобальную переменную, не сотню, не две, ради чего имело бы смысл делать отдельные классы.

+1
RavenS - 2 Сентябрь, 2009 - 17:15
Изображение пользователя RavenS.

В одном месте одну, в другом одну... Потом покажется, что это вполне удобно, ну и... Соблазн велик, зачем лишний раз испытывать? ;D

+1
ktchv - 3 Сентябрь, 2009 - 15:31
Изображение пользователя ktchv.

имхо, надо сразу учиться писать "правильно".

0
linuxevolution - 1 Сентябрь, 2009 - 14:53
Изображение пользователя linuxevolution.

Задумайтесь например о том когда у вас офигенно здоровый корпоративный проект, и когда в этом проетке есть куча глобальных переменных, которые так и гадят в памяти, а не уничтожаются по завершению какого нибудь класса или функции как того требуется, а потом еще и гдето прога глюканет и вылетит, оставля позади себя кучи мусора в памяти и т.д. ;) вот тогда вы поймете что такое глобальные переменные. А насчет кода - код небывает бредовым, это творчество удобства, хоть и не всегда простоты.

0
Ockonal - 1 Сентябрь, 2009 - 15:43
Изображение пользователя Ockonal.

Ппц... Ужас, о чем можно говорить в этой теме? Статистическая переменная решение.

+1
RavenS - 1 Сентябрь, 2009 - 20:04
Изображение пользователя RavenS.

>> Статистическая переменная решение.
Статическая :)

0
Гость - 4 Апрель, 2010 - 21:28

нет глобальные переменные эт конечно зло но описать хотяб const char ProgrammName[] и Version[] эт разве излишество?

0
ktchv - 5 Апрель, 2010 - 17:12
Изображение пользователя ktchv.

в один отдельный инклуд.

0
null56 - 12 Апрель, 2010 - 14:17
Изображение пользователя null56.

Если ты хочешь, чтобы твоя глобальная переменная была в единственном (!!!) экземпляре на все единицы трансляции и была видна из любого модуля:
1) Выбери какую - нибудь одну единицу трансляции, а лучше создай свою. Иными словами создай два файла с именами(допустим): global.h и global.cpp
2) Объяви в хедере ее с ключевым словом extern, а в cpp определи
3) Заинклюдь свой хедер в те единицы трансляции (cpp) где ты хочешь, чтобы твоя переменная была видна
Пример:
global.h
#ifndef __GLOBAL_H_
#define __GLOBAL_H_

extern int g_MyGlobalInt;

#endif

global.cpp
#include "global.h"

int g_MyGlobalInt = 0;

0
Condor - 12 Апрель, 2010 - 16:38
Изображение пользователя Condor.

Теме месяцев 10 уже как, а она всё ещё будоражит умы форумчан.
Когда я спрашивал, как глобально объявить переменную, можно было бы просто ответить, что её надо всего-навсего описать в заголовочном файле в разделе globals.

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include
#include
#include "ui_mainwindow.h"

class MainWindow : public QMainWindow, public Ui::MainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = 0);

bool findevents;
int eventscount;

protected:
void closeEvent(QCloseEvent *event);

private slots:
void SortDataFile();
void EventsSelectione();
void iconActivated(QSystemTrayIcon::ActivationReason reason);

private:
QAction *quitAction;
QAction *launchAction;
QAction *sortAction;
QSystemTrayIcon *trayIcon;
QMenu *trayIconMenu;

};

#endif // MAINWINDOW_H

0
null56 - 12 Апрель, 2010 - 17:25
Изображение пользователя null56.

я не вижу у тебя глобальных переменных, я вижу обычные переменные-члены класса

0
Condor - 12 Апрель, 2010 - 19:19
Изображение пользователя Condor.

bool findevents и int eventscount видны из любой подпрограммы, так что их можно считать глобальными переменными.
В любом случае, проблема хранения данных между подпрограммами решилась таким способом.

0
DeathMoroz - 13 Апрель, 2010 - 08:24

синглтон в помощь

0
null56 - 12 Апрель, 2010 - 23:34
Изображение пользователя null56.

ок ) я не буду продолжать спор, действительно тема уже давно закрыта. просто если под подпрограммами ты подразумеваешь методы-члены класса MainWindow, то я соглашусь с тем, что внутри класса эти переменные можно назвать, хоть и с натяжкой, глобальными относительно экземпляра (!!!) класса
я не хотел поднимать старую тему, просто по невнимательности зашел и отписал как надо объвлять глобальные, для всех единиц трансляции, переменные в global scope

удачи

0
ktchv - 13 Апрель, 2010 - 08:05
Изображение пользователя ktchv.

или статические члены класса.

0
Гость - 23 Июль, 2018 - 15:07

Сделал по образцу "null56 - 12 Апрель, 2010 - 14:17" - не получается. У меня Qt Creator.
Программа по кнопке открывает новую форму (диалог) где пользователь вносит значение. Диалог закрывается и значение (текст) должно вернуться в центральную программу (откуда диалог запускался mainwindow.cpp).
С удовольствием сделаю без глобальных, хотя бы на сигнал\слотах, но след.конструкция также не работает.
...
{
ui->setupUi(this);
connect (dialog_namestring, SIGNAL(StateChanged(QString)), this, SLOT (dialog_namestring_catcher));
}
/*
где:
QString dialog_namestring;// локальная, объявлена в "диалоге"
void MainWindow::dialog_namestring_catcher() {// функция "перехвата" в центральной программе (главное окно вызова диалога)
*/

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры