m0_61770108 2024-05-28 17:20 采纳率: 13.5%
浏览 13
已结题

Qt Console Application项目中,在控制台输入判断执行,再调用类函数,不执行绑定的信号与槽函数

Qt Console Application项目中,在控制台输入判断执行,再调用类函数,不执行绑定的信号与槽函数
测试1:直接调用,可以执行信号与槽函数

img


测试2:从控制台读取数据,控制执行,没有执行信号与槽函数

img

信号与槽函数如下:

img

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-28 17:20
    关注

    引自免费微信小程序:皆我百晓生

    在您的Qt控制台应用程序中,您遇到了一个情况,即当直接调用类方法时,信号与槽关联正常工作,但在控制台读取用户输入并根据输入调用类方法时,信号与槽关联未被执行。为了解决这个问题,我们需要检查几个关键点:

    1. 确保信号与槽连接正确。
    2. 确保槽函数在正确的线程中被调用。

    首先,让我们确保信号与槽的连接是正确的。考虑到代码片段中存在两个QNetworkAccessManager实例和一个定时器,每个都有自己的finished信号和相应的槽函数。这可能会导致混淆。为了简化问题,我们可以合并这两个QNetworkAccessManager实例,并且仅使用一个定时器。以下是修改后的代码示例:

    // 在GetWether.h中
    class GetWether : public QObject {
        Q_OBJECT
    public:
        explicit GetWether(QObject *parent = nullptr);
        ~GetWether();
    
    private slots:
        void onReplied();
        void SendGet();
    
    private:
        QNetworkAccessManager m_netAccessManager;
        QTimer *m_timer;
    };
    
    // 在GetWether.cpp中
    GetWether::GetWether(QObject *parent)
        : QObject(parent), m_timer(new QTimer(this)) {
        connect(&m_netAccessManager, &QNetworkAccessManager::finished, this, &GetWether::onReplied);
        connect(m_timer, &QTimer::timeout, this, &GetWether::SendGet);
        m_timer->start(10 * 60 * 1000);
    }
    
    GetWether::~GetWether() {
        delete m_timer;
    }
    
    void GetWether::onReplied() {
        // 处理网络请求完成的逻辑
    }
    
    void GetWether::SendGet() {
        // 获取当前时间并发送请求
    }
    

    接下来,我们将更新main.cpp中的代码以从控制台读取用户输入并调用GetWeatherInfo函数。同时,我们还需要处理网络请求的结果。

    // 在main.cpp中
    int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
    
        QThread *workerThread = new QThread;
        GetWether *weather = new GetWether(workerThread);
        workerThread->start();
    
        // 从控制台读取用户输入
        int statue;
        std::string name;
        while (true) {
            printf("请输入操作命令:");
            std::cin >> statue;
    
            if (statue == 1) {
                printf("请输入城市名:");
                getline(std::cin, name);
    
                if (!name.empty()) {
                    weather->moveToThread(workerThread);
                    weather->GetWeatherInfo(QString::fromStdString(name));
                    break;
                }
            } else {
                break;
            }
        }
    
        return app.exec();
    }
    

    这个改动将网络请求相关的对象移动到了单独的工作线程中,这样就可以确保信号与槽在正确的地方(工作线程)被触发了。同时,我们通过moveToThread确保了GetWeatherInfo函数也在工作线程中执行。

    现在,你应该能在控制台中输入命令并获取天气信息,同时信号与槽也能正确地被触发和执行了。如果你仍然遇到问题,请提供更详细的错误消息或日志,以便我可以进一步分析。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月6日
  • 创建了问题 5月28日

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错