• 4621阅读
  • 12回复

[提问]MainWindow中的槽函数和线程的信号连接不上 [复制链接]

上一主题 下一主题
离线lesred
 
只看楼主 倒序阅读 楼主  发表于: 2013-03-06
本人初学Qt,希望高人指点一二

————MainWindow.h————————

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtNetwork/QUdpSocket>
#include <QtNetwork/QHostAddress>
#include "../driver_c/fpga_me_ioc.h"
#include <QThread>
namespace Ui {
    class MainWindow;
    class MyThread;
}
class MyThread:public QThread
{
    Q_OBJECT;
public:
    MyThread(QObject *parent =0);
    int fd;
    int ret,arg;
signals:
    void ready_data();
protected:
    void run();
};
class MainWindow : public QMainWindow,public MyThread
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    short temp;
    char gain;
    int buf[256];
    MyThread *b;
public slots:
    void paintEvent(QPaintEvent *);
private:
    Ui::MainWindow *ui;
protected:
private slots:
    void on_action_3_triggered();
};

#endif // MAINWINDOW_H


————MainWindow.cpp————————————————


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtGui>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <QtDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    b->start();    ui->setupUi(this);
}MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::paintEvent(QPaintEvent *)
{
}
MyThread::MyThread(QObject *)
{              
         fd = ::open("/dev/fpga_mea",O_RDWR);
    if(fd<0)
    {
        qDebug()<<"open fpga failed!: \r\n"<<fd;
    }
    else
    {
        while(1)
        {
            ret = ::ioctl(fd, DEV_IOC_WAIT_TASK, &arg);
            if(ret == -108)
            {
                qDebug()<<"ioctl error!: \r\n"<<ret;
            }
            else
            {
                emit ready_data();            
            }        
         }
    }
}
void MyThread::run()
{
    extern MainWindow w;                         //这句是我瞎想的
    connect(this, SIGNAL( ready_data()), &w,SLOT(paintEvent()), Qt::QueuedConnection);   //编译一直是这一句过不去,提示w有问题,但不知道怎样才能和主窗口的槽函数连接上。
    exec();
}
void MainWindow::on_action_3_triggered()
{
}
————main.cpp————————————————————————————————

#include <QtGui/QApplication>
#include "mainwindow.h"
#include <QThread>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();    return a.exec();
}


离线pxiao_xiao

只看该作者 1楼 发表于: 2013-03-06
namespace有么有引用?
你瞎想的那句 能挪到cpp文件的代码上方吗?
离线lesred
只看该作者 2楼 发表于: 2013-03-06
回 1楼(pxiao_xiao) 的帖子
在MainWindow.cpp  引用using  Ui;   ??

把 extern MainWindow w;  放在MainWindow.cpp  上方试了还是不行



提示错误:在run函数中的“QObject”是“Mainwindow”的有歧义的基类
离线pxiao_xiao

只看该作者 3楼 发表于: 2013-03-06
connect(this, SIGNAL( ready_data()), &w,SLOT(paintEvent())

paintEvent() 是 虚函数 不是槽函数
离线lesred
只看该作者 4楼 发表于: 2013-03-06
public slots:
    void test();
protected:
     void paintEvent(QPaintEvent *);

按照这样声明的话   我用connect(this, SIGNAL( ready_data()), &w,SLOT(test());

还是提示没有定义w

离线lesred
只看该作者 5楼 发表于: 2013-03-06
回 3楼(pxiao_xiao) 的帖子
public slots:
    void test();
protected:
     void paintEvent(QPaintEvent *);

按照这样声明的话   我用connect(this, SIGNAL( ready_data()), &w,SLOT(test());

还是提示没有定义w

离线jdwx

只看该作者 6楼 发表于: 2013-03-06
在可以得到两个object指针的任何地方都可以connect。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线pxiao_xiao

只看该作者 7楼 发表于: 2013-03-06
还有为什么要整个多重继承呢
离线lesred
只看该作者 8楼 发表于: 2013-03-06
回 6楼(jdwx) 的帖子
关键问题就在于MainWindow的object指针线程MyThread不知道

在线程中connect一直提示w没有声明
离线lesred
只看该作者 9楼 发表于: 2013-03-06
回 7楼(pxiao_xiao) 的帖子
这个多重继承一开始我没搞懂   其实不继承MyThread  也可以
离线pxiao_xiao

只看该作者 10楼 发表于: 2013-03-06
把你的thread单独写个类
声明的全局的mainWindow w;放到main.cpp的main()之前 再在main()中初始化w
你的thread初始化里就在处理IO run()才是辅线程进行处理的地方
离线cfxks1989

只看该作者 11楼 发表于: 2013-03-06
我感觉你把东西复杂化了,分开写,把mainWidows的指针传给QThread或者在mainWidows中定义一个QThread在把2个信号连接起来就好了
离线pxiao_xiao

只看该作者 12楼 发表于: 2013-03-06
嗯 我繁琐了
快速回复
限100 字节
 
上一个 下一个