• 10477阅读
  • 9回复

执行exec()后的相关问题!(结贴) [复制链接]

上一主题 下一主题
离线nufang19
 
只看楼主 正序阅读 楼主  发表于: 2009-10-04
初学QT,发现若个问题请高手解答!

自己写的程序,在运行exec()后,所有普通函数都不运行了,程序停在exec()后不动。
坛子里翻翻帖子后发现,exec()启动后进入QT消息等待机制。
现在问题是:
exec()启动后只有信号和槽才能运行吗?普通函数不能运行吗?如果这样的话自定义信号函数是能运行还是不能运行
很困惑呀,有人知道的话麻烦吼一声吧,谢谢!



首先感谢318065268   rqzrqh   dbzhang800 3位达人的热心帮助!在我发帖2个小时内居然有3条回复!谢谢,谢谢!
看来是我着急了,没说清楚,浪费大家时间了,不好意思。下面详细说说:
我想做个串口接收数据,然后在QLCDNumber上显示,每次接收数据后,都在QLCDNumber上更新显示的程序,现在的主要问题有:
1、进入exec()后,我不知道如何触发串口发送、接收的消息,好像应该自定义信号。自定义信号的时候最初的触发怎么做呢?我这个应该通过定时器吗?串口发送和接收不能自己触发吗?
2、我的程序是基于两个类的,一个是QT的显示类,一个是linux的串口发送读取数据类,我的信号槽应该分别在这两个类中,这样的话connect怎么写呢?是不是像坛子有人说的在main函数里connect呢?以下是我试着用定时器写的部分程序代码,编译错误说是main.cpp里的“connect”undeclared,具体怎么做呢?怎么moc?我的版本是qt2。用qmake生成的pro和Makefile。
3、moc到底怎么用我看了看参考文献弄得稀里糊涂的,我想是不是用qmake生成Makefile的时候会自动生成moc的链接,所以没有单独用moc,这样行吗?是不是只是在用tmake的时候要单独moc呢?


以下为尝试用定时器写的部分程序代码:
/////////////////main.cpp/////////////////
int main(int argc,char **argv)
  { Q_OBJECT
        QApplication app(argc,argv);
        Form1 w;        
        serial s;                                                                        
        s.set();                      
       app.setMainWidget(&w);
connect(w,SIGNAL(timeout()),s,SLOT(loop()));
connect(s,SIGNAL(mysignal(int v)),w,SLOT(change(int v)));

        w.show();
//    app.exec();

    return(app.exec());
}
/////////////////////lcd.h///////////////////
class Form1 : public QWidget
{
    Q_OBJECT

public:
    Form1( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
    ~Form1();
    QLCDNumber* LCDNumber1;
    QTimer* timer;
public slots:
int change ( int t);

};

//////////////////lcd.cpp///////////////////
Form1::Form1( QWidget* parent,  const char* name, WFlags fl )
    : QWidget( parent, name, fl )
{
.......................
timer = new QTimer( this, "timer" );
timer->start(200);  

int Form1::change(int t)
{

   LCDNumber1->display(t);
    return 0;

}
////////////////////serial.h////////////////////
class serial
{
Q_OBJECT
................
public slots:
void loop();
signals:
void mysignal(int v);

.....................
}

//////////////////serial.cpp///////////////////
void serial::loop()
{
...............    
        nread = read(fd, wbuff, 1);           //串口读取数据
emit mysignal(int v);

}
[ 此帖被nufang19在2009-10-10 09:37重新编辑 ]
离线nufang19
只看该作者 9楼 发表于: 2009-10-10
结贴后给顶上去!

托楼上各位的福,就在昨晚,我的课题做完了!谢谢大家,谢谢qt 中文论坛的各位朋友!回想当时学嵌入式QT/E的漫漫长路,甚是辛苦,有时为了一两个不起眼的小问题,花费一整天甚至好几天时间,真是有点不堪回首。有了论坛各位的陪伴和相互扶持,才有我今天的一点点收获!

关于此帖的问题,因为C++用得不怎么好,对类的结构还比较生疏,属于现学现卖的状态,所以开始的时候创建了两个.h文件。以至于想加一个connect都很困难,看了sdh-bing,318065268,hiti_tony 等高手的回帖,马上茅塞顿开,经过几天与QT/E的艰苦卓绝的搏斗,将其搞定,呵呵。

现在的程序结构为main.cpp app.cpp app.h ,在app.h中定义槽和定时器,在app.cpp中connect,结果很完美!

再次感谢Embedded Qt Programming和General Qt Programming板块的所有人!
离线hiti_tony
只看该作者 8楼 发表于: 2009-10-07
connect(w,SIGNAL(timeout()),s,SLOT(loop()));
connect(s,SIGNAL(mysignal(int v)),w,SLOT(change(int v)));


第一:在main里面肯定不能这样用connect, connect是qobject的,你可以先#include <QObject>,然后用QObject::connect
第二:w是FORM1, 哪里来的timeout?    是w.timer吧!

不行就再贴出来.
离线rqzrqh

只看该作者 7楼 发表于: 2009-10-06
离线318065268
只看该作者 6楼 发表于: 2009-10-05
同意楼上,main函数中整一个类就行了。
可以多加一个类,然后这个类来调度你的串口和你的lcd显示。
Email  rsail@126.com(私人邮箱)
QQ:   318065268
离线sdh-bing
只看该作者 5楼 发表于: 2009-10-05
看了下你的代码,发现了一个问题:main函数里面一般只创建一个窗口对象。
serial s;   完全可以再form中定义。
然后你就可以在form的构造函数里面connect(timer,SIGNAL(timeout()),s,SLOT(loop()));
你的思路不太清晰。
离线nufang19
只看该作者 4楼 发表于: 2009-10-05
自己顶上去!
离线318065268
只看该作者 3楼 发表于: 2009-10-04
不知道是什么事情非要在App.exec()里面执行?
如果是要执行外部的某个程序,可以参考一下Qt进程相关类,提供的有函数可以去做这些事情。
Email  rsail@126.com(私人邮箱)
QQ:   318065268
离线rqzrqh

只看该作者 2楼 发表于: 2009-10-04
我想楼主的意思问为什么exec()后面的语句都不执行了。
所有的GUI都是事件驱动的,也就是进入事件循环后,一直在等待事件的发生来触发某些预定好的东西,比如回调,信号槽。
只有退出exec()之后才可以可能执行后面的语句,不然的话程序一启动还没和用户进行交互就结束了,那还能叫user interface吗?
这个和普通的控制台程序不一样的。
离线dbzhang800

只看该作者 1楼 发表于: 2009-10-04
贴个能说明你的问题的最简单的例子出来。

不然都不清楚你在描述什么
快速回复
限100 字节
 
上一个 下一个