我正在尝试创建一个简单的GUI,该GUI创建多个线程并在GUI始终响应的同时在后台执行一些操作。我正在使用QT框架的QThreads实现此目的,但我面临上述问题。下面是代码。

//Threading.h
这是我的threading.h文件。

#ifndef THREADING
#define THREADING

#include <QThread>
#include <QObject>

class Threading : public QThread
{
    Q_OBJECT

private:
   int num;

public:
    explicit Threading(QObject * parent = 0);
    void run();
    void set_num(int);
    int get_num();

Q_SIGNALS:
    void someSignal(int);

};

//这是threading.cpp文件
#include "threading.h"
#include <QtCore>

Threading::Threading(QObject *parent) : QThread(parent)
{

}

void Threading:: run()
{
  emit someSignal(get_num());
}

void Threading :: set_num(int num)
{
    QMutex mutex;
    mutex.lock();
    this->num = num;
    mutex.unlock();
}

int Threading :: get_num()
{
    return num;
}

//Mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtCore>
#include "threading.h"

typedef unsigned char   byte;

namespace Ui {
 class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

//Mainwindow.cpp
在此文件中,我正在启动线程。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "global.h"
#include <QtCore>
#include <QObject>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{

    ui-> setupUi(this);
   threadPointer = new Threading(this);
   connect(threadPointer,SIGNAL(someSignal(int)),this,SLOT(onSomeSignal()));
 }

void MainWindow::on_clicked()
{
    threadPointer->set_num(0);
    threadPointer->start();
}

我在网上看到了一些视频,这些视频具有完全相似的代码,这很奇怪,但不能正常工作,而我的却不是。与版本有关吗?任何帮助,将不胜感激。

最佳答案

您可以使用Q_EMIT代替emit来绕过此问题,或者只是将信号作为普通函数调用(emit是可选的,并且仅出于提高代码的可读性):

void Threading:: run()
{
  someSignal(get_num());
}
emit是在qobjectdefs.h中定义的空宏。您应该进一步调查,并尝试了解为什么未定义它(例如QT_NO_KEYWORDS是否在某处定义以及为什么)。

您可能还需要检查是否
CONFIG += no_keywords

专业版文件中存在这一行,如this末尾所述。

关于c++ - Qt编译器错误:在此范围内未声明 'emit',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48609640/

10-14 23:56