Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: daimon от Март 27, 2012, 17:03



Название: connectSlotsByName не связывает со слотом
Отправлено: daimon от Март 27, 2012, 17:03
Код
C++ (Qt)
class CProcessThread: public QThread
{
Q_OBJECT
 
QProcess * process;
//////
     public slots:
void on_process_finished(int code, enum QProcess::ExitStatus status);
}
 
CProcessThread::CProcessThread( const QString& appStr, const QStringList& listParam )
{
        process= new QProcess();
        process->setObjectName(QString::fromUtf8("process"));
        QMetaObject::connectSlotsByName(this);
}
 
void CProcessThread::on_process_finished( int code, enum QProcess::ExitStatus status)
{
 
qDebug()<<QString("finish %1 Thread").arg(m_appStr)<<process->exitCode()<<process->exitStatus()<< process->errorString()<<process->error();
 
emit finished(code, status, this);
}
 
что не так? Помогите


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: GreatSnake от Март 27, 2012, 17:15
Может из-за того, что вставляешь "enum" перед QProcess::ExitStatus?
И чем не устроил QObject::connect()?


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: daimon от Март 27, 2012, 17:31
Может из-за того, что вставляешь "enum" перед QProcess::ExitStatus?
И чем не устроил QObject::connect()?

проверяю работу, в другом классе буду использовать плотнее


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: daimon от Март 27, 2012, 17:35
в конструкторе пишу ещё
   qRegisterMetaType<enum QProcess::ExitStatus>("enum QProcess::ExitStatus");
   qRegisterMetaType<enum QProcess::ProcessError>("enum QProcess::ProcessError");

не работает и всё


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: mutineer от Март 27, 2012, 17:37
Код:
process= new QProcess();

А родителя кто процессу задавать будет?

Цитировать
Searches recursively for all child objects of the given object, and connects matching signals from them to slots of object


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: GreatSnake от Март 27, 2012, 17:42
А родителя кто процессу задавать будет?
Какой глазастый, однако)


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: GreatSnake от Март 27, 2012, 17:47
в конструкторе пишу ещё
   qRegisterMetaType<enum QProcess::ExitStatus>("enum QProcess::ExitStatus");
   qRegisterMetaType<enum QProcess::ProcessError>("enum QProcess::ProcessError");

не работает и всё
Интересно, из каких соображений такое понадобилось ???


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: daimon от Март 27, 2012, 17:53
в конструкторе пишу ещё
   qRegisterMetaType<enum QProcess::ExitStatus>("enum QProcess::ExitStatus");
   qRegisterMetaType<enum QProcess::ProcessError>("enum QProcess::ProcessError");

не работает и всё
Интересно, из каких соображений такое понадобилось ???
обычный коннект не принимал тип и всё, пришлось так описать


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: daimon от Март 27, 2012, 17:55
Код:
process= new QProcess();

А родителя кто процессу задавать будет?

Цитировать
Searches recursively for all child objects of the given object, and connects matching signals from them to slots of object
ворнинг в консоли пропал, но связи всё равно нет


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: Bepec от Март 27, 2012, 17:56
эээ... А обычный enum разве не тупой int?


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: daimon от Март 27, 2012, 17:57
эээ... А обычный enum разве не тупой int?
гуглил и решение такой ситуации было только в регистрации типа - для обычного коннетка


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: sudo от Март 27, 2012, 18:50
в конструкторе пишу ещё
   qRegisterMetaType<enum QProcess::ExitStatus>("enum QProcess::ExitStatus");
   qRegisterMetaType<enum QProcess::ProcessError>("enum QProcess::ProcessError");

Если эти энамы отправляются в кьютешных сигналах, то они уже зарегистрированы. Регистрировать их снова не нужно, проблема в другом

Код
C++ (Qt)
 
void on_process_finished(int code, enum QProcess::ExitStatus status);
 

Здесь enum не нужен

Процесс запускал? В приведённом коде нету


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: mutineer от Март 27, 2012, 18:59
ворнинг в консоли пропал, но связи всё равно нет

Какой еще ворнинг? Почему в исходном сообщение не написано про ворнинг? Что за угадайка?

Здесь enum не нужен

Было в первом ответе. Интересно, сколько раз придется это повторить, чтобы ТС увидел:)


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: sudo от Март 27, 2012, 19:04
Было в первом ответе.

Повторенье - мать ученья :D


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: daimon от Март 27, 2012, 19:55
не работает и всё
ворнинг простой - нет сигнала для слота


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: Bepec от Март 27, 2012, 19:59
Нет сигнала - значит:
1) ты ошибся в написании (проверь 2 раза, потом ещё раз)
2) твой тип вообще не понимает Qt. Убери его наф*г  и вставь int.
3) у тебя где то ошибка в слоте ;) И да, УБЕРИ НАФИГ СВОЙ енум ;)

PS а ещё лучше минимально компилируемый пример выложи :D


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: daimon от Март 27, 2012, 19:59
Нет сигнала - значит:
1) ты ошибся в написании (проверь 2 раза, потом ещё раз)
2) твой тип вообще не понимает Qt. Убери его наф*г  и вставь int.
3) у тебя где то ошибка в слоте ;) И да, УБЕРИ НАФИГ СВОЙ енум ;)

PS а ещё лучше минимально компилируемый пример выложи :D
убирал не пашет


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: mutineer от Март 27, 2012, 20:03
убирал не пашет

не пашет - исправляй. Хочешь более развернутый ответ - давай больше информации. Процесс запускаешь?


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: daimon от Март 27, 2012, 20:04
Код
C++ (Qt)
class CProcessThread: public QThread
{
Q_OBJECT
 
 
QString m_appStr;
QStringList m_listParam;
QProcess * m_process;
 
signals:
void finished(int , enum QProcess::ExitStatus exitStatus, CProcessThread *);
void error(enum QProcess::ProcessError, QString);
 
 
public:
CProcessThread(const QString& appStr, const QStringList& listParam);
CProcessThread();
void setParams(const QString& appStr, const QStringList& listParams);
void run();
~CProcessThread();
public slots:
void finish();
void errorFinish();
 
 
 
};
 
#include "CProcessThread.h"
 
 
 
void CProcessThread::run()
{
 
 
if(m_process == NULL)
m_process= new QProcess();
 
 
connect(m_process,SIGNAL(finished(int , enum QProcess::ExitStatus)), this, SLOT(finish()));
 
 
connect(m_process,SIGNAL(error(enum QProcess::ProcessError)), this, SLOT(errorFinish()));
 
qDebug()<<"//---------------------------//\n"<<QString("start %1 Thread").arg(m_appStr)<<m_listParam;
 
m_process->start(m_appStr, m_listParam);
 
 
exec();
 
 
 
 
}
 
void CProcessThread::setParams( const QString& appStr, const QStringList& listParams )
{
m_appStr = appStr;
m_listParam = listParams;
}
 
CProcessThread::CProcessThread( const QString& appStr, const QStringList& listParam )
{
setParams(appStr,listParam);
m_process = NULL;
 
 
}
 
CProcessThread::CProcessThread()
{
 
m_process =NULL;
 
}
 
CProcessThread::~CProcessThread()
{
qDebug()<<QString("delete %1 Thread").arg(m_appStr);
  delete m_process;
  m_process = NULL;
}
 
void CProcessThread::finish()
{
 
qDebug()<<QString("finish %1 Thread").arg(m_appStr)<<m_process->exitCode()<<m_process->exitStatus()<< m_process->errorString()<<m_process->error();
 
 
emit finished(m_process->exitCode(), m_process->exitStatus(), this);
}
 
void CProcessThread::errorFinish()
{
emit error(m_process->error(), m_process->errorString());
finish();
}
 
 
рабочий код с обычными коннектами


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: Bepec от Март 27, 2012, 20:23
Вот почему нормальный вроде человек, вроде имеющий опыт разработки, выкладывает НЕРАБОТАЮЩИЙ  проект без инклудов и нуждающийся в допиливании???


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: daimon от Март 27, 2012, 20:26
Вот почему нормальный вроде человек, вроде имеющий опыт разработки, выкладывает НЕРАБОТАЮЩИЙ млять проект без инклудов и нуждающийся в допиливании???

#include <QtGui>

всё родное))))


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: mutineer от Март 27, 2012, 20:35
рабочий код с обычными коннектами

То есть это работает?


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: daimon от Март 27, 2012, 20:37
рабочий код с обычными коннектами

То есть это работает?

да

класс запускает процессы (программы) с параметрами

задача убрать коннекты для QProcess *m_process


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: mutineer от Март 27, 2012, 20:43
Ну для этого m_process должен иметь this родителем. Но это вряд ли получится, так как эти объекты живут в разных потоках


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: daimon от Март 27, 2012, 20:46
самое смешное - создаю m_process в конструкторе класса и убираю создание в функции run() - ничего не работает
как?

пишет мол не могу создать ребёнок так как в разных потоках, но я ведь процесс делаю не ребёнком класса, просто создаю


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: mutineer от Март 27, 2012, 20:50
самое смешное - создаю m_process в конструкторе класса и убираю создание в функции run() - ничего не работает
как?

пишет мол не могу создать ребёнок так как в разных потоках, но я ведь процесс делаю не ребёнком класса, просто создаю

m_process->start(m_appStr, m_listParam); создает дочерний по отношению к m_process объект. m_process и его ребенок получаются в разных потоках

А зачем вообще весь этот код? QProcess и без того асинхронно работает


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: Bepec от Март 27, 2012, 20:56
Кстати интересный сигнал. Который действительно возвращает enum. Походу ещё одна недоработка троллей ;)


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: sudo от Март 28, 2012, 10:59
Кстати интересный сигнал. Который действительно возвращает enum. Походу ещё одна недоработка троллей ;)

Их over9000, которые энамы возвращают

Написал сейчас сэмпл, реально не коннектится, даже если objectName задать


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: mutineer от Март 28, 2012, 11:02
daimon Зачем ты везде суешь слово enum?


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: GreatSnake от Март 28, 2012, 11:10
Написал сейчас сэмпл, реально не коннектится, даже если objectName задать
Показывай код - тоже будем пробовать.


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: sudo от Март 28, 2012, 11:11
Руки, блин, оторвать. Всем! И мне тоже. И глаза разуть Хотя нет, не надо. Посмотрел, вроде всё изначально нормально было, в первом сообщении. Но я тот код не пробовал, сразу сэмпл.

main.cpp
Код
C++ (Qt)
// Local
#include "Object.h"
 
// Qt
#include <QCoreApplication>
#include <QTimer>
 
 
int main(int argc, char *argv[])
{
 QCoreApplication a(argc, argv);
 
 Object obj;
 QTimer::singleShot(0, &obj, SLOT(startProcess()));
 
 return a.exec();
}
 

Object.h
Код
C++ (Qt)
#ifndef OBJECT_H
#define OBJECT_H
 
// Qt
#include <QObject>
#include <QProcess>
 
 
class Object : public QObject
{
 Q_OBJECT
 
 public:
   Object(QObject* parent = 0);
 
 public slots:
   void startProcess();
   void on_process_finished(int exitCode, QProcess::ExitStatus exitStatus);
 
 private:
   QProcess* process;
};
 
#endif // OBJECT_H
 

Object.cpp
Код
C++ (Qt)
// Local
#include "Object.h"
 
// Qt
#include <QDebug>
 
 
Object::Object(QObject* parent)
 : QObject(parent),
   process(new QProcess(this))
{
 process->setObjectName("process");
 QMetaObject::connectSlotsByName(this);
}
 
 
void Object::startProcess()
{
 process->start("ls -l");
}
 
 
void Object::on_process_finished(int exitCode, QProcess::ExitStatus exitStatus)
{
 qDebug() << exitCode << exitStatus;
}
 


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: GreatSnake от Март 28, 2012, 11:50
Вполне рабочий сэмпл. В чём проблема?


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: sudo от Март 28, 2012, 11:51
Вполне рабочий сэмпл. В чём проблема?

Ага, забыл сказать, что этот рабочий  ;D


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: mutineer от Март 28, 2012, 11:54
Вполне рабочий сэмпл. В чём проблема?

Ага, забыл сказать, что этот рабочий  ;D

У мно тож все работает. У ТС две проблемы в коде - parent и слово enum ))


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: GreatSnake от Март 28, 2012, 12:05
Код
C++ (Qt)
CProcessThread::CProcessThread( const QString& appStr, const QStringList& listParam )
{
setParams(appStr,listParam);
m_process = NULL;
}
 
CProcessThread::CProcessThread()
{
m_process =NULL;
}
 
Мдя...
А где инициализация базового класса QThread ???


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: mutineer от Март 28, 2012, 12:08
А ты тоже глазастый:)


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: GreatSnake от Март 28, 2012, 12:09
У мно тож все работает. У ТС две проблемы в коде - parent и слово enum ))
Кстати, с enum тоже всё работает.


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: sudo от Март 28, 2012, 12:22
У мно тож все работает. У ТС две проблемы в коде - parent и слово enum ))
Кстати, с enum тоже всё работает.

При прямом коннекте его нормализатор должен порезать, а через connectSlotsByName нужно смотреть, что возвращает QMetaMethod. Раз работает, значит порезанные параметры возвращает


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: sudo от Март 28, 2012, 12:24
Мдя...
А где инициализация базового класса QThread ???

По идее, сролять не должно, просто parent как 0 пронизиализируется. А нам важно, чтобы parent был только у QProcessа


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: GreatSnake от Март 28, 2012, 12:33
По идее, сролять не должно, просто parent как 0 пронизиализируется. А нам важно, чтобы parent был только у QProcessа
Согласен. Исходя из всего вышесказанного TC нас просто парит...


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: daimon от Март 28, 2012, 14:01
daimon Зачем ты везде суешь слово enum?

консоль буркнула как-то при коннекте не знает такой тип, вот и пришлось так писать и ещё его регестрировать - заметил в другом классе


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: mutineer от Март 28, 2012, 14:09
Вот бы еще ты выводы консоли сюда писал...


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: daimon от Март 28, 2012, 17:31
Вы говорите зачем я создал этот класс, мол процесс и так создаёт отдельный поток - всё просто, в моём классе есть сигнал, который возвращает указатель на этот поток и в другом классе, где я динамически создаю объекты вот этого класса, я вяжу с коннектом и удаляю также динамически (по пришедшему указателю) - плюс: сигнал приходит только, когда поток-процесс закончил работу и в другом классе могу параллельно динамически создавать кучу таких потоков и они сами удаляться по окончанию работы


хорошо есть ещё один вариант не использовать мой класс, а использовать просто QProcess, но тогда нужно вязать сигнал финиша именно класса QProcess со своим слотом, где нужно разыменовывать sender() на QProcess и там удалять  (не очень нравиться такой вариант)


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: mutineer от Март 28, 2012, 17:33
хорошо есть ещё один вариант не использовать мой класс, а использовать просто QProcess, но тогда нужно вязать сигнал финиша именно класса QProcess со своим слотом, где нужно разыменовывать sender() на QProcess и там удалять  (не очень нравиться такой вариант)

connect(process, SIGNAL(finished(...)), process, SLOT(deleteLater()));
не подойдет такое?


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: daimon от Март 28, 2012, 17:37
хорошо есть ещё один вариант не использовать мой класс, а использовать просто QProcess, но тогда нужно вязать сигнал финиша именно класса QProcess со своим слотом, где нужно разыменовывать sender() на QProcess и там удалять  (не очень нравиться такой вариант)

connect(process, SIGNAL(finished(...)), process, SLOT(deleteLater()));
не подойдет такое?
я про него говорю, вот только нужно узнать про указатель - разименовать (в этом процессе может быть ошибка)


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: mutineer от Март 28, 2012, 17:38
хорошо есть ещё один вариант не использовать мой класс, а использовать просто QProcess, но тогда нужно вязать сигнал финиша именно класса QProcess со своим слотом, где нужно разыменовывать sender() на QProcess и там удалять  (не очень нравиться такой вариант)

connect(process, SIGNAL(finished(...)), process, SLOT(deleteLater()));
не подойдет такое?
я про него говорю, вот только нужно узнать про указатель - разименовать (вот мне не нравиться процесс разименования)

Что разыменовывать? deleteLater() это стандартный слот у любого QObject, который его удаляет


Название: Re: connectSlotsByName не связывает со слотом
Отправлено: daimon от Март 28, 2012, 17:56
хорошо есть ещё один вариант не использовать мой класс, а использовать просто QProcess, но тогда нужно вязать сигнал финиша именно класса QProcess со своим слотом, где нужно разыменовывать sender() на QProcess и там удалять  (не очень нравиться такой вариант)

connect(process, SIGNAL(finished(...)), process, SLOT(deleteLater()));
не подойдет такое?
я про него говорю, вот только нужно узнать про указатель - разименовать (вот мне не нравиться процесс разименования)

Что разыменовывать? deleteLater() это стандартный слот у любого QObject, который его удаляет
не знал, кстати ещё есть беда одна, вот нет такого сигнала у QProcess, который строку ошибки возвращает - всё равно нужно разыменовывать