crossplatform.ru

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

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:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 17)
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) *
Оно же уже даже компилит
во-во, а ты до сих пор не понимаешь, как это произошло
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 22.8.2010, 15:24
Сообщение #11


Zombie Mod
*****

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

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




Репутация:   212  


все как то туго...
connect(table, SIGNAL(cellDoubleClicked(int,int)), this, SLOT(myfunc(int,int)));
Такая вот штука есть. Мне нужно чтоб при 2-м щелчке на ячейку (в любой строке) 2-го столбца, грубо говоря выполнялся
void MainWindow::switch_to_ten(int row, int column)
{
    if (column==1)
    {
        ...
    }
}
Но я не пойму вот что, SIGNAL(cellDoubleClicked(int,int)) я получаю эти int или как, как они связаны с SLOT(myfunc(int,int)). Короче я уже совсем запутался. Я просто первый раз без формы и не могу разобраться с этими сигналами-слотами и тд.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dreamcode
  опции профиля:
сообщение 22.8.2010, 16:07
Сообщение #12


Студент
*

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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 22.8.2010, 10:49) *
непонятно к чему такой совет


А что не так ????? :mad:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.8.2010, 16:37
Сообщение #13


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

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

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




Репутация:   94  


Цитата(dreamcode @ 22.8.2010, 20:07) *
А что не так ?????
родитель объекта не указан - окно верхнего уровня, зачем?
если родителя нет, то кто удалять его будет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 26.8.2010, 23:04
Сообщение #14


Zombie Mod
*****

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

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




Репутация:   212  


Разобрался с слотами-сигналами. Всякое простое типа: нажатие на кнопки и тд работает. А с этим до сих пор не понятно:
connect(table, SIGNAL(cellDoubleClicked(int,int)), this, SLOT(myfunc(int,int)));
Почему не пашит. Я не пойму как в мою функцию передать номер строки,столбца.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 27.8.2010, 14:57
Сообщение #15


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(RazrFalcon @ 27.8.2010, 0:04) *
Почему не пашит. Я не пойму как в мою функцию передать номер строки,столбца.

никто не поймет почему не пашет пока не покажешь весь код.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
CodeHunter
  опции профиля:
сообщение 27.8.2010, 16:38
Сообщение #16


Студент
*

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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 22.8.2010, 16:37) *
родитель объекта не указан - окно верхнего уровня, зачем?
если родителя нет, то кто удалять его будет?


При закрытии проги он сам удалится !!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 27.8.2010, 16:41
Сообщение #17


Zombie Mod
*****

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

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




Репутация:   212  


.cpp
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    setupUi(this);
    ...
    table = new QTableWidget(this);
    tableTen = new QTableWidget(this);
    tableTen->setVisible(false);
    connect(table, SIGNAL(cellDoubleClicked(int,int)), this, SLOT(switch_to_ten()));
    ...
}

void MainWindow::switch_to_ten()
{
    ...
}
.h
QT_BEGIN_NAMESPACE
class QTableWidget;
QT_END_NAMESPACE

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

public:
    MainWindow(QWidget *parent = 0);

protected:
    void resizeEvent(QResizeEvent *e );

private:
    QTableWidget *table;
    QTableWidget *tableTen;

private slots:
    void switch_to_ten();

};



Сообщение отредактировал RazrFalcon - 27.8.2010, 16:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.8.2010, 19:14
Сообщение #18


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

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

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




Репутация:   94  


Цитата(CodeHunter @ 27.8.2010, 20:38) *
При закрытии проги он сам удалится !!!
а до этого? Кокгда-нибудь приходилось встречаться с термином "утечка памяти"?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 14.7.2025, 12:07