0

请有人就这个问题提出建议..?我必须使用从 QEvent 派生的类将数据从我的 TX 线程发送到主窗口。

我希望我的 RX 线程在收到一些数据时抛出一个事件,这样我就可以在主窗口中显示该数据。

当按下按钮启动时,我启动一个主线程。我将指向主窗口的指针保存在主线程对象内。我将使用此指针将事件发布到主窗口对象。

当我第一次进入 Qthread 函数 dowork_rx() 时。事件被抛出,我能够在 customEvent() 处理程序中捕获它。但是当我抛出事件时 dowork_rx() while 循环开始时,它不会触发 customEvent() 函数。

请建议如何解决此问题。

我的 qevent 课 :---

//String event derived class
template <typename T> class StringEvent : public QEvent
{
   QString m_str;
public:
   explicit StringEvent(const QString val) : QEvent(staticType()), m_str(val)
   {
   }

   void setvalue(QString val)
   {
       m_str = val;
   }

   QString value() const
   {
       return m_str;
   }

   static QEvent::Type staticType()
   {
      static int type = QEvent::registerEventType();
      return static_cast<QEvent::Type>(type);

      /*
        static int type;
      if(type == 0)
      {
          type = QEvent::registerEventType();
      }

         return static_cast<QEvent::Type>(type);*/
   }

   static bool is(const QEvent * ev)
   {
       return ev->type() == staticType();
   }
};

class UpdateEvent : public StringEvent<UpdateEvent>
{
public:
    explicit UpdateEvent(QString val): StringEvent(val)
    {
       //qDebug() << "hello";

    }

};


class ClearEvent  : public StringEvent<ClearEvent>
{
public:
    explicit ClearEvent(QString val): StringEvent(val)
    {

    }
};

线程的dowork函数:----

// Common slot for the rx - thread
void RxThreadObject::dowork_rx()
{
    int i =0;
    qDebug() << "\nrx start \n";

    myUpdateEvent_rx = new UpdateEvent("UpdateEventObject - dowork_rx");
    //myUpdateEvent_rx->setvalue("first");
    QCoreApplication::postEvent(m_pMainThreadObj->ptrmainwindow, myUpdateEvent_rx);
    qDebug() << "\nrx throw event - done \n";

    while(!m_bQuitRx)
    {

        SleepTimerDelay::sleep(2);

        if(i==0){
            //qDebug() << "\nrx throw event - done  11 \n";
            myUpdateEvent_rx = new UpdateEvent("first");
            myUpdateEvent_rx->setvalue("first");
            QCoreApplication::postEvent(m_pMainThreadObj->ptrmainwindow, myUpdateEvent_rx);
            i++;
        }else{
            //qDebug() << "\nrx throw event - done  22 \n";
            myUpdateEvent_rx = new UpdateEvent("second");
            myUpdateEvent_rx->setvalue("second");
            QCoreApplication::postEvent(m_pMainThreadObj->ptrmainwindow, myUpdateEvent_rx);
            i=0;
        }


    }

    qDebug() << "\nrx end \n";

}

事件处理程序:----

/*!
** Custom event handler
*/
void MainWindow::customEvent(QEvent *event)
{
    qDebug() << "oo customEvent";
   if (UpdateEvent::is(event)) {
       UpdateEvent *tempUpdateEvent = static_cast<UpdateEvent *>(event);
       qDebug() << tempUpdateEvent->value();

   }
   else if (ClearEvent::is(event)) {
       ClearEvent *tempClearEvent = static_cast<ClearEvent *>(event);
       qDebug() << tempClearEvent->value();

   }

}

/*!
** event filter handler
*/
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{

    qDebug() << "oo  eventFilter";
   if (UpdateEvent::is(event)) {
       UpdateEvent *tempUpdateEvent = static_cast<UpdateEvent *>(event);
       qDebug() << tempUpdateEvent->value();

   }
   else if (ClearEvent::is(event)) {
       ClearEvent *tempClearEvent = static_cast<ClearEvent *>(event);
       qDebug() << tempClearEvent->value();

   }

   return true;

}
4

0 回答 0