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&
) 或常量引用 (const QString&
) 获取字符串,而不是通过复制。
有几个原因不希望对 const
参数使用 const
引用。 Qt 对QString
s 使用隐式共享,因此几乎没有效率。插槽签名已标准化,因此 const
引用将被替换为值。最后,如果您提前对签名进行规范化,查找速度会稍微快一些。
我认为const QString&
总是更可取的。有许多非直观的方式让您意外地导致您的隐式共享数据获得detach
ed。还要注意 Qt API 中接受 QString 的每个函数是如何使用 const 引用的,无一例外。
我必须同意至少,const
引用明确地传达了意图。插槽和信号将是该一般规则的一个例外。以上是关于Qt 调试:我正在实现一个使用时无法识别的 Qt 线程类,我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以让 Qt Creators Ui 设计器为其无法识别的类创建插槽?
Qt Creator 2.7.1 和 Qt 4.8.4 无法远程调试库