Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Daywer от Апрель 03, 2017, 14:05



Название: Не выполняется присоединенный слот
Отправлено: Daywer от Апрель 03, 2017, 14:05
Уважаемы коллеги помогите горю. Присоединенный слот не выполняется.

field.h:

Код
C++ (Qt)
#ifndef FIELD_H
#define FIELD_H
#include <QWidget>
#include <QTableWidget>
#include <QHeaderView>
#include <QObject>
 
class field : public QObject
{
  Q_OBJECT
 
public:
   field(QWidget * i,int x, int y, int BeginSize);
   QTableWidget  * tablewidget;
 
public slots:
   int waitValue();
 
};
 
#endif // FIELD_H
 
 

field.cpp:

Код
C++ (Qt)
#include "field.h"
 
field::field(QWidget * parent,int x, int y, int BeginSize)
{
 
int i,
    NumCellsOfField = 10,  
    CorrectSize = 2,  
    FieldSize = BeginSize+CorrectSize;
 
tablewidget = new QTableWidget(parent);
 
tablewidget->setGeometry(x,y,FieldSize,FieldSize); //положение и размер поля
tablewidget->setRowCount(NumCellsOfField);
tablewidget->setColumnCount(NumCellsOfField);
//поле 10 x 10 циклом
for (i=0;i!=NumCellsOfField;i++)
                {
                    tablewidget->setRowHeight(i,BeginSize/NumCellsOfField);
                    tablewidget->setColumnWidth(i,BeginSize/NumCellsOfField);
                }
 
connect(tablewidget,SIGNAL(cellClicked(int,int)),this, SLOT(waitValue()));
}
 
 
int field::waitValue(){
 
   tablewidget->setItem(0, 3, new QTableWidgetItem);
   tablewidget->item(0, 3)->setBackground(Qt::red);
   return 0;
}


Компилятор не ругается. Но слот waitValue() не выполняется.
Если   строку в которой соединение происходит заменить на:

connect(tablewidget,SIGNAL(cellClicked(int,int),tablewidget, SLOT(hide()));

то все отлично отрабатывает. Со своим слотом работает отлично, но не со слотом класса field.
при ручном вызове функции waitValue() тоже все отлично.
Как понять причину не вызова? Что я упускаю?


Название: Re: Не выполняется присоединенный слот
Отправлено: __Heaven__ от Апрель 03, 2017, 14:17
Вы принципиально не пишете тип возвращаемого значения в методах?


Название: Re: Не выполняется присоединенный слот
Отправлено: gil9red от Апрель 03, 2017, 14:22
Daywer, пожалуйста оформляйте код. Выше смайлов есть комбобокс с языками, выделите код, кликните на комбобокс и выберите из списка нужный язык.



Название: Re: Не выполняется присоединенный слот
Отправлено: Daywer от Апрель 03, 2017, 14:27
Вы принципиально не пишете тип возвращаемого значения в методах?
Пока пробую нет. Это не принципиально сейчас. Даже если напишу что Int ничего не изменится


Название: Re: Не выполняется присоединенный слот
Отправлено: Пантер от Апрель 03, 2017, 14:30
Daywer, отформатируй свое первое сообщение тегом code

Код
C++ (Qt)
int foo()
{
   return 0;
}
 

И приведи полный код, без обгрыженных типов возвращаемых значений.


Название: Re: Не выполняется присоединенный слот
Отправлено: Daywer от Апрель 03, 2017, 14:30
Daywer, пожалуйста оформляйте код. Выше смайлов есть комбобокс с языками, выделите код, кликните на комбобокс и выберите из списка нужный язык.


Спасибо. Я исправлюсь


Название: Re: Не выполняется присоединенный слот
Отправлено: qate от Апрель 03, 2017, 14:35
connect(tablewidget,SIGNAL(cellClicked(int,int),tablewidget, SLOT(hide()));

скобки не попутал ?


Название: Re: Не выполняется присоединенный слот
Отправлено: Daywer от Апрель 03, 2017, 14:39
connect(tablewidget,SIGNAL(cellClicked(int,int),tablewidget, SLOT(hide()));

скобки не попутал ?


нет. Скопировал криво просто. Форматировал текст пока видно накосячил.


Название: Re: Не выполняется присоединенный слот
Отправлено: __Heaven__ от Апрель 03, 2017, 15:32
Вы принципиально не пишете тип возвращаемого значения в методах?
Пока пробую нет. Это не принципиально сейчас. Даже если напишу что Int ничего не изменится
Попробуйте написать, может moc спотыкается.


Название: Re: Не выполняется присоединенный слот
Отправлено: __Heaven__ от Апрель 03, 2017, 15:40
Ещё можно попробовать другой тип коннекта
Код
C++ (Qt)
connect(tablewidget, &QTableWidget::cellClicked, this, &field::waitValue);
Возможно, компиль выдаст полезную диагностику в случае неуспеха


Название: Re: Не выполняется присоединенный слот
Отправлено: Daywer от Апрель 03, 2017, 15:48
Вы принципиально не пишете тип возвращаемого значения в методах?
Пока пробую нет. Это не принципиально сейчас. Даже если напишу что Int ничего не изменится
Попробуйте написать, может moc спотыкается.

Поправил как вы говорили - нет результата.


Название: Re: Не выполняется присоединенный слот
Отправлено: Daywer от Апрель 03, 2017, 15:49
Ещё можно попробовать другой тип коннекта
Код
C++ (Qt)
connect(tablewidget, &QTableWidget::cellClicked, this, &field::waitValue);
Возможно, компиль выдаст полезную диагностику в случае неуспеха

Компиль не сругался. Собралось все. Но результат тот же.


Название: Re: Не выполняется присоединенный слот
Отправлено: gil9red от Апрель 03, 2017, 16:06
Фигня какая-то выходит :)
Приложите к сообщению архив с проектом с данной проблемой
(в дополнительные опции при составлении сообщения есть кнопка вложения)


Название: Re: Не выполняется присоединенный слот
Отправлено: Daywer от Апрель 03, 2017, 16:39
Фигня какая-то выходит :)
Приложите к сообщению архив с проектом с данной проблемой
(в дополнительные опции при составлении сообщения есть кнопка вложения)

Прикрепил к первому сообщению


Название: Re: Не выполняется присоединенный слот
Отправлено: __Heaven__ от Апрель 03, 2017, 17:11
Код
C++ (Qt)
connect(tablewidget, &QTableWidget::cellClicked, [&]{qDebug() << "lambda";});
 
Так работает.
Какая-то проблема, кажется, связанная с родителями. Как-то странно у вас связь настроена.


Название: Re: Не выполняется присоединенный слот
Отправлено: Daywer от Апрель 03, 2017, 17:22
Код
C++ (Qt)
connect(tablewidget, &QTableWidget::cellClicked, [&]{qDebug() << "lambda";});
 
Так работает.
Какая-то проблема, кажется, связанная с родителями. Как-то странно у вас связь настроена.

 Да. lambda  в консоль выводится. С реальной функцией нет.  Странно связь настроена..а как надо?


Название: Re: Не выполняется присоединенный слот
Отправлено: __Heaven__ от Апрель 03, 2017, 17:56
Попробуйте наследовать field от QWidget, таблицу вкладывать в него и родителем таблицы делать именно его.
Скажу сразу - предположение пальцем в небо


Название: Re: Не выполняется присоединенный слот
Отправлено: Mikhail от Апрель 03, 2017, 18:31
А ничего, что ваш слот возвращает значение?


Название: Re: Не выполняется присоединенный слот
Отправлено: Daywer от Апрель 03, 2017, 18:57
А ничего, что ваш слот возвращает значение?
Даже если будет void ничего не измениться. Перепробовал уже.


Название: Re: Не выполняется присоединенный слот
Отправлено: Пантер от Апрель 03, 2017, 19:54
Эх, вы, проглядели. А я увидел. :)

Daywer, у тебя battlefield на стеке создан, он умирает при выходе из конструктора MainWindow, вот поэтому и не вызывается слот.


Название: Re: Не выполняется присоединенный слот
Отправлено: Daywer от Апрель 03, 2017, 21:56
Эх, вы, проглядели. А я увидел. :)

Daywer, у тебя battlefield на стеке создан, он умирает при выходе из конструктора MainWindow, вот поэтому и не вызывается слот.

В отладке то не умирает вроде....И где его создавать же тогда.


Название: Re: Не выполняется присоединенный слот
Отправлено: Daywer от Апрель 03, 2017, 21:59
Попробуйте наследовать field от QWidget, таблицу вкладывать в него и родителем таблицы делать именно его.
Скажу сразу - предположение пальцем в небо

Надо попробовать. Но что-то поле рождается вне окна и пропадает тут же. Пока этот вариант тоже пробую.


Название: Re: Не выполняется присоединенный слот
Отправлено: Пантер от Апрель 03, 2017, 22:09
Эх, вы, проглядели. А я увидел. :)

Daywer, у тебя battlefield на стеке создан, он умирает при выходе из конструктора MainWindow, вот поэтому и не вызывается слот.

В отладке то не умирает вроде....И где его создавать же тогда.
Сделать мембером класса MainWindow.


Название: Re: Не выполняется присоединенный слот
Отправлено: Daywer от Апрель 03, 2017, 22:32
Эх, вы, проглядели. А я увидел. :)

Daywer, у тебя battlefield на стеке создан, он умирает при выходе из конструктора MainWindow, вот поэтому и не вызывается слот.

В отладке то не умирает вроде....И где его создавать же тогда.
Сделать мембером класса MainWindow.

Через зачленивание работает. Преогромнейшее спасибо. Ошибку понял переварить осталось в уме все это
Хотел чтоб код в классах таился и не толкать лишнее в mainwindow, но.........
Наверное надо было сделать battlefield наследником QTableWidget изначально.


Название: Re: Не выполняется присоединенный слот
Отправлено: Daywer от Апрель 04, 2017, 08:01
Хочу сказать спасибо участникам этого форума. Помогли и никто не послал даже. Добрые отзывчивые люди.