Qt Console Application项目中,在控制台输入判断执行,再调用类函数,不执行绑定的信号与槽函数
测试1:直接调用,可以执行信号与槽函数
测试2:从控制台读取数据,控制执行,没有执行信号与槽函数
信号与槽函数如下:
Qt Console Application项目中,在控制台输入判断执行,再调用类函数,不执行绑定的信号与槽函数
测试1:直接调用,可以执行信号与槽函数
信号与槽函数如下:
引自免费微信小程序:皆我百晓生
在您的Qt控制台应用程序中,您遇到了一个情况,即当直接调用类方法时,信号与槽关联正常工作,但在控制台读取用户输入并根据输入调用类方法时,信号与槽关联未被执行。为了解决这个问题,我们需要检查几个关键点:
首先,让我们确保信号与槽的连接是正确的。考虑到代码片段中存在两个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
函数也在工作线程中执行。
现在,你应该能在控制台中输入命令并获取天气信息,同时信号与槽也能正确地被触发和执行了。如果你仍然遇到问题,请提供更详细的错误消息或日志,以便我可以进一步分析。