找回密码
 立即注册
收起左侧

关于界面和线程的问题

11
回复
8933
查看
[复制链接]
累计签到:132 天
连续签到:1 天
来源: 2015-8-25 16:08:31 显示全部楼层 |阅读模式
1Qter豆
我在Widget中的ui中放一个lineedit,想实现:运行后在lineedit中输入值,按下按钮后将输入的值读取传入到我的工作线程里。我想的是建立一个信号和槽,在按钮的槽函数里发射信号将值传入工作线程里,但是在工作线程里那个接受信号的槽函数应该写在哪里?run函数在这里又应该怎么写?

最佳答案

查看完整内容

你在controlthread.h里包含widget.h干什么?widget应该就是你主线程吧,,controlthread.h是子线程!
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-8-25 16:08:32 显示全部楼层
qq1043068972 发表于 2015-8-26 10:47
declare class does not name a type

出现这个编译错误主要有四个可能原因,现总结如下:

你在controlthread.h里包含widget.h干什么?widget应该就是你主线程吧,,controlthread.h是子线程!
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-8-25 19:39:18 显示全部楼层
你这相当于是主线程向子线程发射信号吧?  可以在主线程的构造函数里这么写: connect(this,发射的信号,子线程对象,读取的数据的函数),,,run的话,,写一句exec();让子线程一直在那么等待信号的到到来就好了!
回复

使用道具 举报

累计签到:132 天
连续签到:1 天
2015-8-26 08:50:54 显示全部楼层
qq1043068972 发表于 2015-8-25 19:39
你这相当于是主线程向子线程发射信号吧?  可以在主线程的构造函数里这么写: connect(this,发射的信号,子线 ...

这是我的代码,不知道写的对不对,运行之后 error: 'ControlThread' does not name a type
widget.h
#ifndef WIDGET_H
#define WIDGET_H


#include <QWidget>
#include "controlthread.h"
#include <QThread>

namespace Ui {
class Widget;
}
class QPushButton;
class Widget : public QWidget
{
    Q_OBJECT
   
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    int num;


private:
    Ui::Widget *ui;
    ControlThread control;

signals:
    void data(int n);
public slots:
    void receivecolor(int m);
private slots:
    void on_pushButton_clicked();
};

#endif // WIDGET_H


widget.cpp
#include <QtGui>
#include "widget.h"
#include "ui_widget.h"

#include <QThread>
#include <QDebug>


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    qDebug()<<"ada"<<endl;

    connect(this,SIGNAL(data(int)),&control,SLOT(receiveData(int)));
    connect(&control,SIGNAL(turncolor(int)),this,SLOT(receivecolor(int)));


}

Widget::~Widget()
{
    delete ui;
}


void Widget:n_pushButton_clicked()
{
    num=ui->lineEdit->text().toInt();
    control.start();
    emit data(num);

}

void Widget::receivecolor(int m)
{
    QPixmap pix;
    if(m==1)
    {
        pix.load( "D:/maydayadagdbobbylyf/000/Images/green.png" );
        ui->label->setPixmap(pix);
    }
    else if(m==0)
    {
        pix.load( "D:/maydayadagdbobbylyf/000/Images/red.png" );
        ui->label->setPixmap(pix);

    }

}


controlthread.h
#ifndef CONTROLTHREAD_H
#define CONTROLTHREAD_H

#include "widget.h"

#include <QThread>

class ControlThread : public QThread
{
public:
    ControlThread();


    void run();


public slots:
    void receiveData(int n);
private:

signals:

    void turncolor(int m);
protected:

};

#endif // CONTROLTHREAD_H


controlthread.cpp
#include "controlthread.h"
#include <QDebug>
#include <QObject>
#include <QThread>


ControlThread::ControlThread()
{   
}

void ControlThread::run()
{
       exec();

}

void ControlThread::receiveData(int n)
{
   if(n==1)
   {
       qDebug()<<"连接正确"<<endl;
       emit turncolor(1);

   }
   else if(n==0)
   {
       qDebug()<<"连接错误"<<endl;
       emit turncolor(0);

   }

}

  

点评

declare class does not name a type 出现这个编译错误主要有四个可能原因,现总结如下: 1.引用的类命名空间未包含 2.引用的类头文件未包含 3.包含了头文件,或者已经前置声明了,则说明所引用的类名写错。 4.  详情 回复 发表于 2015-8-26 10:47
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-8-26 10:47:05 显示全部楼层
adaluobo 发表于 2015-8-26 08:50
这是我的代码,不知道写的对不对,运行之后 error: 'ControlThread' does not name a type
widget.h
#ifn ...

declare class does not name a type

出现这个编译错误主要有四个可能原因,现总结如下:

1.引用的类命名空间未包含

2.引用的类头文件未包含

3.包含了头文件,或者已经前置声明了,则说明所引用的类名写错。

4.循环引用头文件

点评

你在controlthread.h里包含widget.h干什么?widget应该就是你主线程吧,,controlthread.h是子线程!  详情 回复 发表于 2015-8-26 10:49
回复

使用道具 举报

累计签到:132 天
连续签到:1 天
2015-8-26 11:10:41 显示全部楼层
qq1043068972 发表于 2015-8-26 10:49
你在controlthread.h里包含widget.h干什么?widget应该就是你主线程吧,,controlthread.h是子线程! ...

我修改完了,但是还是报错 undefined reference to  ControlThread::turncolor(int)
turncolor(int)是我在子线程的一个信号。
run 函数里只要写一句exec();就可以了么?exec()我不太知道它怎么用

点评

undefined reference to ControlThread::turncolor(int) 说明子线程的信号有问题啊,,定义的,你去掉形参试试!turncolor(int m),不要m exec是循环等待事件的到来,,你要是不写这句,run()运行完了,你就子线程就退出了  详情 回复 发表于 2015-8-26 12:44
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-8-26 12:44:02 显示全部楼层
adaluobo 发表于 2015-8-26 11:10
我修改完了,但是还是报错 undefined reference to  ControlThread::turncolor(int)
turncolor(int)是我 ...

undefined reference to  ControlThread::turncolor(int)
说明子线程的信号有问题啊,,定义的,你去掉形参试试!turncolor(int m),不要m

exec是循环等待事件的到来,,你要是不写这句,run()运行完了,你就子线程就退出了
回复

使用道具 举报

累计签到:132 天
连续签到:1 天
2015-8-26 14:19:51 显示全部楼层
qq1043068972 发表于 2015-8-26 12:44
undefined reference to  ControlThread::turncolor(int)
说明子线程的信号有问题啊,,定义的,你去掉形参 ...

信号定义:void turncolor(int)改成这样,还是报同样的错误,我在widget.h
中定义的信号void data(int n);都没有问题
回复

使用道具 举报

累计签到:132 天
连续签到:1 天
2015-8-26 14:58:12 显示全部楼层
qq1043068972 发表于 2015-8-26 12:44
undefined reference to  ControlThread::turncolor(int)
说明子线程的信号有问题啊,,定义的,你去掉形参 ...

我的好用了,是因为没有 Q_OBJECT,所以在子线程定义的信号的槽都是无效的~,不过很感谢你!

点评

这个是QT的宏,想用信号和槽必须有这个,,你见的是C++工程吧,所以没有自动生成,,一般如果直接建QT的widget项目,,直接就自己写上了  详情 回复 发表于 2015-8-27 08:44
可以这样QObject::connect  详情 回复 发表于 2015-8-26 15:35
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-8-26 15:35:40 显示全部楼层
adaluobo 发表于 2015-8-26 14:58
我的好用了,是因为没有 Q_OBJECT,所以在子线程定义的信号的槽都是无效的~,不过很感谢你! ...

可以这样QObject::connect
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-8-27 08:44:34 显示全部楼层
adaluobo 发表于 2015-8-26 14:58
我的好用了,是因为没有 Q_OBJECT,所以在子线程定义的信号的槽都是无效的~,不过很感谢你! ...

这个是QT的宏,想用信号和槽必须有这个,,你见的是C++工程吧,所以没有自动生成,,一般如果直接建QT的widget项目,,直接就自己写上了
回复

使用道具 举报

累计签到:132 天
连续签到:1 天
2015-8-27 09:17:29 显示全部楼层
qq1043068972 发表于 2015-8-27 08:44
这个是QT的宏,想用信号和槽必须有这个,,你见的是C++工程吧,所以没有自动生成,,一般如果直接建QT的widget ...

对呀,我建的是C++工程,所以没有那个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了