【问题标题】:Qudpsocket readyread() don't work in try-catch blockQudpsocket readyread() 在 try-catch 块中不起作用
【发布时间】:2020-07-27 13:17:04
【问题描述】:

我想通过 UDP 协议获取消息。 如果我在 try-catch 块中创建与 QUdpsocket 一起使用的对象,则信号 readyread() 不起作用。 但是,如果我从 try-catch 块中创建了 UDPworker 的对象 - 一切正常。 我在异常和 Qt 组合中做错了什么? 是关于实现QUdpsocket的吗?

ma​​in.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QtDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //MyUDP m_UDP; // its work
    
    try
    {
        MyUDP m_UDP; // its not work! WHY?!

    }
    catch(...)
    {
        qDebug()<< "Unknown exception cautch!!!" << endl;
    }

    return a.exec();
}

pr.pro

QT       += core gui network
CONFIG += c++14 console
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = untitled
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += \
        main.cpp \
        mainwindow.cpp

HEADERS += \
        mainwindow.h

FORMS += \
        mainwindow.ui

ma​​inwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
MainWindow::~MainWindow()
{
    delete ui;
}
MyUDP::MyUDP(QObject *parent) :
    QObject(parent)
{
    socket = new QUdpSocket(this);
    socket->bind(QHostAddress::LocalHost, 6650);
    connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
}

ma​​inwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QUdpSocket>
#include <QMessageBox>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

//Base class QObject
class MyUDP : public QObject
{
  Q_OBJECT

  public:
      explicit MyUDP(QObject *parent = 0);

      void SayHello();

public slots:
      void readData(){
          QMessageBox::information(0, "Внимание","Это очень важный текст", 0,0,0);
      }

  private:
      QUdpSocket *socket;
};

#endif // MAINWINDOW_H

【问题讨论】:

  • “不工作”是什么意思?为什么您发布的代码中的try 块为空?
  • 即使在删除 // 之后,您的代码也只是创建了一个 MyUDP 实例,对它什么都不做,然后终止......
  • 它的例子......“不工作” - 意味着当消息到来时信号未激活。
  • 好的,但是如果你这样做了int main(int argc, char *argv[]) { QApplication a(argc, argv); MyUDP m_UDP; return a.exec(); } 程序工作正常,我得到消息框...
  • 您的 MyUDP 实例在 try/catch 块的 try 子句范围内。它将被构造,然后在其他任何事情发生之前立即销毁。

标签: c++ qt sockets try-catch qudpsocket


【解决方案1】:

您在 try 块内创建 MyUDP,但在超出 try/catch 范围时未发现任何错误,因此 MyUDP 开始被销毁:

try {
        MyUDP m_UDP; // Created in the stack, valid only inside the try block

}
catch (...)
{
}
//m_UDP is already destroyed and undefined here

我应该补充一点,您正在使用 QObjects,并且不是以预期/正统的方式使用信号/插槽机制,但这超出了您的问题。您应该阅读有关 QObject 和信号/槽机制的文档,Qt 有大量在线信息和 QtAssistant 应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    相关资源
    最近更新 更多