Qt 调试:我正在实现一个使用时无法识别的 Qt 线程类,我做错了啥?

Posted

技术标签:

【中文标题】Qt 调试:我正在实现一个使用时无法识别的 Qt 线程类,我做错了啥?【英文标题】:Qt Debugging: I am implementing a Qt thread class that is not being recognized when used, what am I doing wrong?Qt 调试:我正在实现一个使用时无法识别的 Qt 线程类,我做错了什么? 【发布时间】:2012-06-09 00:02:55 【问题描述】:

所以我在我的程序中实现了一个线程类,我试图从我的主窗口运行它,但它没有被识别。我将在线程头和文件下方发布,以及主窗口头和文件。

CONTEXT:线程包含一个循环,该循环遍历目录中的文件并发送信号以将标题打印到主窗口。

directoryprinter.h(线程头)

#ifndef DIRECTORYPRINTER_H
#define DIRECTORYPRINTER_H

#include <QThread>
#include <QtCore/QDir>
#include <QtCore/QDirIterator>

class DirectoryPrinter : public QThread

    Q_OBJECT
public:
    explicit DirectoryPrinter(QObject *parent = 0);
    void DirectoryParser();
    void run();

signals:
    void SendSignal(QString);

private:
    QDirIterator * it;    
;

#endif // DIRECTORYPRINTER_H

线程类定义

#include "directoryprinter.h"

DirectoryPrinter::DirectoryPrinter(QObject *parent) :
    QThread(parent)

    it = new QDirIterator ("C:Users/Andrew/",QDirIterator::Subdirectories);


void DirectoryPrinter::DirectoryParser()

    while (it->hasNext())
    
        QString String = it->next();
        SendSignal(String);
    


void DirectoryPrinter::run()

    this->DirectoryParser();

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>
#include <iostream>
#include "directoryprinter.h"

//UNINITIALIZED POINTERS??

namespace Ui 
class MainWindow;


class MainWindow : public QMainWindow

    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    void Print(QString String);
    ~MainWindow();

private slots:
    void on_pushButton_released();

private:
    Ui::MainWindow *ui;
    DirectoryPrinter *Name; //THIS LINE IS NOT RECOGNIZED
;

#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    ui->setupUi(this);
    connect(Name,SIGNAL(SendSignal(QString)),this,SLOT(Print(QString)));
    

void MainWindow::Print(QString String)

    ui->textBrowser->setText(String);


MainWindow::~MainWindow()

    delete ui;


void MainWindow::on_pushButton_released()

    Name = new DirectoryPrinter();
    Name->start();

程序退出:退出代码-1073741819

但是,我认为问题出在我上面评论的那一行。我不确定从哪里开始调试它,我有一些想法,但它们大多是猜测,而且我没有太多使用线程的经验。

提前致谢。让我知道是否需要任何进一步的信息。

【问题讨论】:

“不被识别”是什么意思? 很抱歉没有详细说明。例如,我有时会制定一个错误,它会在DirectoryPrinter *Name; 中说在 * 或类似的东西之前有一个预期的分号。我无法重现它。 【参考方案1】:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);
    connect(Name,SIGNAL(SendSignal(QString)),this,SLOT(Print(QString)));

MainWindow 的构造函数中,您正在连接来自尚未初始化的对象的信号(在调用on_pushButton_released() 之前,您不会初始化Name)。要解决此问题,请在构造函数中创建 Name

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

    ui->setupUi(this);
    Name = new DirectoryPrinter(this);//this is the parent; takes care of cleanup
    connect(Name,SIGNAL(SendSignal(QString)),this,SLOT(Print(QString)));


void MainWindow::on_pushButton_released()

    //Name = new DirectoryPrinter(); not needed here anymore
    Name->start();

从下面的评论来看,这里还有另一个问题——即MainWindow::Print 没有定义为slot(使用slots: 宏)。应该是:

class MainWindow : public QMainWindow

    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    //void Print(QString String); // <-- not here...
    ~MainWindow();

public slots:
    void Print(QString String); // <-- here instead

// ...other class-definition stuff
;

【讨论】:

您好!这似乎已经摆脱了这个问题。但是,信号/插槽连接是否正确实施?我现在似乎得到了这个: Object::connect: No such slot MainWindow::Print(QString) Object::connect: (receiver name: 'MainWindow') 已编辑。您还应该考虑在该槽中通过引用 (QString&amp;) 或常量引用 (const QString&amp;) 获取字符串,而不是通过复制。 有几个原因不希望对 const 参数使用 const 引用。 Qt 对QStrings 使用隐式共享,因此几乎没有效率。插槽签名已​​标准化,因此 const 引用将被替换为值。最后,如果您提前对签名进行规范化,查找速度会稍微快一些。 我认为const QString&amp; 总是更可取的。有许多非直观的方式让您意外地导致您的隐式共享数据获得detached。还要注意 Qt API 中接受 QString 的每个函数是如何使用 const 引用的,无一例外。 我必须同意至少,const 引用明确地传达了意图。插槽和信号将是该一般规则的一个例外。

以上是关于Qt 调试:我正在实现一个使用时无法识别的 Qt 线程类,我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以让 Qt Creators Ui 设计器为其无法识别的类创建插槽?

Qt Creator 2.7.1 和 Qt 4.8.4 无法远程调试库

Qt项目ui文件中新添加的控件在代码中不识别的问题解决

Qt 应用程序无法加载自定义插件调试库

在 Windows 上使用 Qt Creator 进行调试时未显示 QStrings

Qt 调试崩溃/退出 python 并最终无法正确调试(例如,不在断点处停止)