Quantcast
Channel: Qt DevNet forums: Installation and Deployment
Viewing all articles
Browse latest Browse all 2113

Cann't create signals ?

$
0
0
Dear Qt Forumers, I wrote simple programm to learn more about threads ssynchronization and have encountered problem when tried to build executable. The compiler couldn’t find reference to one of signals SetMyText(QString, int). Could you please be so kind to help me with this bug (I waste enough time and exhausted). Thank you for help in advance. Please, take a look on codes: main.cpp #include <QApplication> #include "ThreadAB.h" #include "MyThread.h" #include "MyString.h" int main(int argc, char *argv[]){       QApplication a(argc, argv);     //    QDebugStream cerr(std::cerr);     //    QDebugStream cout(std::cout);       ThreadAB *window = new  ThreadAB();     window -> show();       return a.exec(); } MyThread.h #ifndef MYTHREAD_H #define MYTHREAD_H #include <QApplication> #include <QThread> class Thread : public QThread {  public:   Thread();     void run();   void stop();   void setThreadName(QString);   QString thread_name;   int running_number;    private:   volatile bool stopped;    signals:   void SetMyText (QString, int); }; #endif //MYTHREAD_H MyThread.cpp #include "MyThread.h" #include <QDebug> Thread::Thread() {   stopped = false; } void Thread::run() {   while (!stopped) {     running_number += 1;     if(thread_name.left(1) == "A")       qDebug() << thread_name << ": running_number= " << running_number << endl;     else       qDebug() << "                                      "           << thread_name << ": running_number= " << running_number << endl;         sleep(1);   }   emit SetMyText(thread_name, running_number);   //  stopped = false; } void Thread::stop()   {   stopped = true; } void Thread::setThreadName(QString message) {   thread_name    = message;   running_number = 0;   } ThreadAB.h #ifndef THREADAB_H #define THREADAB_H #include "MyThread.h" #include "QDialog" #include <QCloseEvent> class ThreadAB : public QDialog {   Q_OBJECT       public:   ThreadAB(QWidget *parent = 0);    protected:   void closeEvent(QCloseEvent *event);    private:   Thread      *threadA;   Thread      *threadB;   QPushButton *threadAButton;   QPushButton *threadBButton;   QPushButton *quitButton;     private slots:   void startOrStopThreadA();   void startOrStopThreadB();     }; #endif //THREADAB_H ThreadAB.cpp #include "ThreadAB.h" #include "MyString.h" #include <QTextCodec> #include <QPushButton> #include <QHBoxLayout> ThreadAB::ThreadAB(QWidget *parent)   : QDialog(parent) {   QTextCodec *utfcodec = QTextCodec::codecForName("UTF-8");   QTextCodec::setCodecForTr(utfcodec);   QTextCodec::setCodecForCStrings(utfcodec);     this->setWindowTitle("Threads");   threadA = new  Thread();   threadB = new  Thread();     threadA -> setThreadName("A thread");   threadB -> setThreadName("B thread");   //  threadA -> running_number=0;     //  threadB -> running_number=0;     threadAButton = new QPushButton(tr("Start A"), this);   threadBButton = new QPushButton(tr("Start B"), this);   quitButton    = new QPushButton(tr("Quit"), this);   quitButton -> setDefault(true);   // layout : start   QHBoxLayout *layout = new QHBoxLayout;   layout -> addWidget(threadAButton);   layout -> addWidget(threadBButton);   layout -> addWidget(quitButton);   this -> setLayout(layout);       connect(threadAButton, SIGNAL(clicked()),     this, SLOT(startOrStopThreadA()));   connect(threadBButton, SIGNAL(clicked()),     this, SLOT(startOrStopThreadB()));   connect(quitButton, SIGNAL(clicked()),     this, SLOT(close()));     MyString *p_str =new MyString();     QObject::connect(     threadA, SIGNAL(SetMyText  (QString, int)),     p_str,  SLOT   (set_mes_str(QString, int)) );   QObject::connect(     threadB, SIGNAL(SetMyText  (QString, int)),     p_str,   SLOT  (set_mes_str(QString, int)) );   } void ThreadAB::startOrStopThreadA() {   if (threadA -> isRunning()) {     threadA -> stop();     threadAButton -> setText(tr("Start A"));   } else {     threadA -> start();     threadAButton -> setText(tr("Stop A"));   } } void ThreadAB::startOrStopThreadB() {   if (threadB -> isRunning()) {     threadB -> stop();     threadBButton -> setText(tr("Start B"));   } else {     threadB -> start();     threadBButton -> setText(tr("Stop B"));   } } void ThreadAB::closeEvent(QCloseEvent *event) {   threadA -> stop();   threadB -> stop();   threadA -> wait();   threadB -> wait();   event -> accept(); } MyString.h #ifndef MySTRING_H #define MySTRING_H #include <QMessageBox> class MyString : public QObject {   Q_OBJECT       public:   MyString();     public slots:   void set_mes_str(QString, int);   void show_mes_str();    signals:   void mes_str_is_set();     private:   QString message_string; }; #endif //MySTRING_H MyString.cpp #include "MyString.h" #include <QDebug>   MyString::MyString(){   QObject::connect(     this, SIGNAL(mes_str_is_set()),     this,  SLOT (show_mes_str()  ) ); }   void MyString::set_mes_str(QString thread_name, int running_number) {   message_string =  thread_name + "->" + running_number;   qDebug() << "set_mes_str : message_string = " << message_string;   emit mes_str_is_set(); } void MyString::show_mes_str()/ {   QMessageBox msg;   msg.setText(message_string);   msg.exec(); }

Viewing all articles
Browse latest Browse all 2113

Trending Articles