crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Основы написания программы без использования дизанера
RazrFalcon
  опции профиля:
сообщение 22.8.2010, 7:02
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Есть к примеру таблица(QTableWidget). К ней обращаюсь из разных функций. То есть если к примеру:
MainWindow::MainWindow(QWidget *parent) : QMainWindow (parent) 
{
...
QTableWidget* table = new QTableWidget;
...
}
могу обращятся к table только здесь, из другой функции не могу.
Если делаю наоборот, глобально создаю:
QTableWidget* table = new QTableWidget;
MainWindow::MainWindow(QWidget *parent) : QMainWindow (parent)
{
...
...
}
то сразу QWidget: Must construct a QApplication before a QPaintDevice
Ошибка новичка, но не могу понять в чем проблема. Так как без дизайнера первый раз пишу.
PS прошу сильно не пинать :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.8.2010, 7:46
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(RazrFalcon @ 22.8.2010, 11:02) *
глобально создаю:
Во-первых, глобальные объекты инициализируются до вызова функции main. А виджетам нужно, чтобы уже был создан объект QApplication.
Во-вторых, нет никакой нужды делать таблицу глобальной.

Обычно делают класс, например, MainWindow. И создают в нём объекты относящиеся к нему.
Т.е. указатель на таблицу делают членом класса, и в конструкторе создают объект и им инициализируют указатель.

Полезно пройтись по учебному пособию по виджетам
Также рекомендую посмотреть длинное, но увлекательное и полезное учебное пособие из старой версии Qt





Старое полезно тем, что там многое разобрано по косточкам, даны домашние задания, а в результате получаешь вполне законченную игру-стрелялку
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dreamcode
  опции профиля:
сообщение 22.8.2010, 9:05
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 52
Регистрация: 2.11.2009
Пользователь №: 1201

Спасибо сказали: 1 раз(а)




Репутация:   0  


В классе MainWindow определи поле QTableWidget* table

А потом в конструкторе класса MainWindow пиши table = new QTableWidget;


и не забудь про table.show()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.8.2010, 10:49
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(dreamcode @ 22.8.2010, 13:05) *
А потом в конструкторе класса MainWindow пиши table = new QTableWidget;


и не забудь про table.show()
непонятно к чему такой совет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 22.8.2010, 11:08
Сообщение #5


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Почитал ссылки, ничего в принципе нового не открыл. Так и не нашел там нужного. Ну разве что через слоты?!
dreamcode, спасибо заработало. Я знал что решение простое :lol:
Разве что дополню, что нужно именно:
table = new QTableWidget(this)
Иначе создается еще одно окно.
Появилась проблема:
//в .h
QTableWidget* table1;
QTableWidget* table2;
//в .cpp
table1 = new QTableWidget(this);
table2 = new QTableWidget(this);
Приводит к error: ISO C++ forbids declaration of ‘QTableWidget’ with no type <_<

В .h кинул #include <QTableWidget> и все завелось, еще раз всем спасибо.

Хмм... Через несколько успешных компиляций выдало
QMetaObject::connectSlotsByName: No matching signal for on_table_cellDoubleClicked(int,int)
QMetaObject::connectSlotsByName: No matching signal for on_table_cellChanged(int,int)

При условии что ничего особо не менял, только мелочи. Как сделать "Go To Slot" ("Перейти к слоту", у меня англ версия просто) программно, а не через дизайнер? Я так понимаю через слоты?!

Сообщение отредактировал RazrFalcon - 22.8.2010, 11:28
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 22.8.2010, 11:31
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


В .h вместо #include <QTableWidget> лучше добавить class QTableWidget;
и почитать про forward declaration.


Цитата(RazrFalcon @ 22.8.2010, 12:08) *
При условии что ничего особо не менял, только мелочи.

Не большие изменения, вместо одной таблицы сделал две? :)
А имена слотов для автоконнекта поменять забыл.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 22.8.2010, 11:56
Сообщение #7


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Цитата(BRE @ 22.8.2010, 11:31) *
Не большие изменения, вместо одной таблицы сделал две? :)
Оно сначала и с двумя компилило.
Цитата(BRE @ 22.8.2010, 11:31) *
А имена слотов для автоконнекта поменять забыл.
Об этом даже не знал, пойду читать. Про forward declaration почитал но так и не прояснил ничего. :huh:

сделал так, ошибок 0 но, The program has unexpectedly finished.
connect(table, SIGNAL(cellDoubleClicked(int,int)), this, SLOT(table_cellDoubleClicked(int,int)));


Сообщение отредактировал RazrFalcon - 22.8.2010, 12:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.8.2010, 12:38
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(RazrFalcon @ 22.8.2010, 15:08) *
Почитал ссылки, ничего в принципе нового не открыл.
значит не прочитал, полностью пройдись по старому учебному пособию. Кучу времени сэкономишь!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 22.8.2010, 15:00
Сообщение #9


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Цитата(Litkevich Yuriy @ 22.8.2010, 12:38) *
значит не прочитал, полностью пройдись по старому учебному пособию. Кучу времени сэкономишь!

Уже дважды прочитал. Я не пойму в чем проблема. Оно же уже даже компилит :blink:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.8.2010, 15:01
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(RazrFalcon @ 22.8.2010, 19:00) *
Оно же уже даже компилит
во-во, а ты до сих пор не понимаешь, как это произошло
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.4.2024, 14:13