如果在Qt中出现调试窗口未定义变量的情况,这通常表示代码中存在拼写错误、语法错误或逻辑错误等问题。常见的情况包括没有正确引用头文件、忘记声明变量和使用了未定义的变量等。在处理这种情况时,我们可以先从编译器输出的错误信息中找到错误提示,然后逐个排查代码中可能的问题点,打印出相关变量的值,以便排查问题的来源。此外,Qt还提供了许多调试工具,如Qt Creator中的调试器、跟踪器和QML Profiler等,这些工具可以帮助我们更快速、有效地诊断和解决问题。
在软件公司如雨后春竹般迅速冒出的今天,越来越多软件开发公司选用快速开发平台为客户服务,但如果是自己研发平台不说需要很多的人力、物力,而且还不一定可以做好,因此大部分软件开发商都选择了直接购买开发平台,节约人力、物力。
但市场的快速开发平台好坏参半,并不容易找到好的。而天翎myApps工作流平台作为一个快速开发平台,已经包含50万行源码,平台封装的大量成熟而实用的可视化应用组件和模块为用户提供了应用系统开发所需要的一切基础设施,开发人员在开发过程中通过WEB页面登陆后台即可配置应用,让产品不但能够由专业的开发人员使用,同时也能让最终用户拥有搭建自己应用系统的能力。myApps使开发效率提高了一个数量级,节约了超过85%的开发工作量,大大缩短了应用开发的调试期,降低了用户的开发成本。填补了国内J2EE快速应用开发平台的空白,引导行业进入一个崭新的时期。
所需知识,QT编程,Linux系统调用编程,Linux设备驱动编程
0,假设你的步进电机驱动已经编写完成,并已经加载到你的Linux系统中,设备文件名位于/dev/文件夹下,文件名为Machine0。
1,在QT程序中,新建一个属于你自己的类,如Widget用于显示。
2,在你的类中添加Edit对像,再添加一个用于 *** 作硬件的新方法,如controlMachine,建立Edit对像值的变化与controlMachine函数之间的信号与槽机制(使用connect函数)。
3,完善你的controlMachine函数,在函数中实现:读取Edit中变量的值,放在你的新变量中,使用Linux系统函数open打开设备文件,调用::ioctl函数(在QT中直接调用系统函数前边得加::两个冒号),使用ioctl传入参数,然后关闭文件。
建议你还是参数一下例子吧,网上有QT控制LED灯的例子,baidu一下QT LED,或友善之臂的Linux示例代码(写了几个Linux的系统调用,非常有用)或其它开发板的例子,或其它的关键字搜索。你把他们的例子读懂了之后,再来写你的程序,就非常简单了,我就是这么完成我的第一个小项目的。
希望对你有帮助。
ui
门牙会稍息
原创
关注
3点赞·53人阅读
前言:
最近在学习嵌入式qt开发,然后跟着教程编写了一个简单的串口上位机程序,在编写的时候还算比较顺利,但在调试的时候花了点功夫,折腾了一下午。最后还是理清了思路,解决了问题,特写此博客进行记录和总结。
串口上位机界面设计:
整个软件的界面我都是用ui来设计的,其实也可以用代码,但是想了想有好多布局相互嵌套比较麻烦。最后就使用了ui界面来设计。
ui界面设计
串口上位机程序功能设计:
然后像串口对象初始化,槽函数,一些逻辑关系都用代码来实现,头文件就只有一些变量、槽的定义。
头文件
#include "widgeth"
#include "ui_widgeth"
#include <QMessageBox>
Widget::Widget(QWidget parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//lcd屏的分辨率是1024X600
this->setFixedSize(QSize(1024, 600));
//new 一个QSerialPort对象
serialPort = new QSerialPort(this);
//通过foreach语句将windows或imx6ull可用串口识别出来,并添加至对应的下拉选择框
QStringList serialList;
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){
serialList += infoportName();
}
ui->comboBox->addItems(serialList);
//设置串口的信号与槽
connect(serialPort, SIGNAL(readyRead()), this, SLOT(readData()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_radioButton_clicked(bool checked)
{
//点击“打卡串口”button之后的一些串口配置 *** 作,和一些逻辑关系
if(checked){
//设置串口端
serialPort->setPortName(ui->comboBox->currentText());
//设置波特率
serialPort->setBaudRate(ui->comboBox_2->currentText()toInt());
//设置停止位
serialPort->setStopBits(QSerialPort::StopBits(ui->comboBox_4->currentText()toInt()));
//设置数据位
serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_6->currentText()toInt()));
//设置校验位
switch(ui->comboBox_5->currentIndex()){
case 0:
serialPort->setParity(QSerialPort::Parity::NoParity);
break;
case 1:
serialPort->setParity(QSerialPort::Parity::EvenParity);
break;
case 2:
serialPort->setParity(QSerialPort::Parity::OddParity);
break;
case 3:
serialPort->setParity(QSerialPort::Parity::SpaceParity);
break;
case 4:
serialPort->setParity(QSerialPort::Parity::MarkParity);
break;
default:
break;
}
serialPort->setFlowControl(QSerialPort::NoFlowControl);
if(!serialPort->open(QSerialPort::ReadWrite)){
QMessageBox::about(this, "串口打开错误提示", "可能被占用了");
return;
}
//打开串口之后其他的选择按钮设置成不可用
ui->comboBox->setEnabled(false);
ui->comboBox_2->setEnabled(false);
ui->comboBox_4->setEnabled(false);
ui->comboBox_5->setEnabled(false);
ui->comboBox_6->setEnabled(false);
ui->radioButton->setText("关闭串口");
}
else{
serialPort->close();
ui->comboBox->setEnabled(true);
ui->comboBox_2->setEnabled(true);
ui->comboBox_4->setEnabled(true);
ui->comboBox_5->setEnabled(true);
ui->comboBox_6->setEnabled(true);
ui->radioButton->setText("打开串口");
}
}
void Widget::readData()
{
//将串口中的数据打印到textBrowser中
ui->textBrowser->insertPlainText(serialPort->readAll());
}
void Widget::on_pushButton_clicked()
{
//点击“发送”button之后,将textEdit中的内容写入串口
serialPort->write(ui->textEdit->toPlainText()toUtf8());
}
void Widget::on_pushButton_2_clicked()
{
//清屏 *** 作
ui->textEdit->clear();
ui->textBrowser->clear();
}
登录后复制
在windows端编写好程序之后,将工程文件发送到ubuntu进行qmake、make最后通过scp将ARM的可执行文件发送到开发板,接下来就是验证了
我用的是正点原子出厂的系统,所以在验证的时候需要使用到一个串口来连接到开发板执行编写好的上位机程序,所以一个串口就被占用了,正点原子教程视频就用开发板的另一个串口来进行测试
正点原子教程测试方式
因为放假回了家,我也没有带太多的东西,usb转ttl模块放在了学校。所以我在想怎么就用一个串口来完成实验。困扰我的就是唯一的一个串口必须留个上位机,然后要怎么执行开发板上的串口上位机程序?最初我想到了可以使用网络通过Xshell远程连接到开发板就可以执行,唯一的串口就拿来验证。
解决完上位机软件怎么在imx6ull上执行的问题,接下来就是验证了。验证的时候又出现了一些问题,上位机软件不像想象的那样一边发数据,一边就接收对应的数据,而出现了一些imx6ull的信息,好像还可以输入命令,感到非常奇怪。
我以为我的软件有问题,就在windows上换了一个串口软件,结果还是出现了类似的情况
最后也是在不断猜想和测试之后找到了原因,就是应因为我在给开发板上电的时候接入了串口线,然后先打开了windows上的串口,然后就使用到了串口,导致就相当于有一个串口控制imx6ull开发板,像Xshell中通过串口连接开发板一样。然后我尝试在windows的上位机软件输入命令想打开一个qt程序,最后也是成功打开证实了猜想
执行/list命令打开了蛇姐list程序(qt程序的路径是/home/root/qt_project/list)
如果想要实现实验最初windows和imx6ull两个上位机互换数据的效果的话。要先通过windows中的上位机软件输入命令来打开imx6ull的上位机软件,这样相当于windows中的上位机连接的就是imx6ull的上位机了,而不是直接控制imx6ull了,之后就可以正常收发数据了。
总结:
学了qt快半个月了,这个串口上位机算是一个比较综合的练习了,结合了ui和代码设计。加上最后的调试也是收获颇多,如果有usb-ttl模块的话验证步骤就会更简单。
QT与ARM没有直接的关系,QT说自己能跨平台。注意,这个平台说的不是CPU平台而是 *** 作系统。
只要你的嵌入式设备上装有 *** 作系统,QT程序就能在上面运行。例如:QT中有网络的概念,但是完全不同于C51的网络编程,C51里你需要知道网络芯片在总线上的地址,怎么造作网络芯片的寄存器,怎么去ENABLE它,然而QT中的网络只是着重于协议、线程等东西和硬件完全无关。
因此,学习嵌入式QT你首先要对你的ARM开发板安装 *** 作系统,编译环境,之后,学习QT的方法和学习MFC基本上没啥区别。
最后,QT是跨平台硬件无关的,也就是说你在windows、台式机上用QT的方法与在手机、塞班系统上用QT的方法差别不大,因此你会在windows上用qt就OK了,其他的系统上不同的无非是编译与配置方法,对于这些较为死板的东西,都是要用的时候再到网上去查查的。
1 “用Qt写的程序编译比MFC慢”的说法是错误的
绝对错误,单位代码行数编译Qt远比MFC快得多,因为Qt库的头文件设计非常好,尽量都使用了前置声明,避免了头文件嵌套,几乎所有类都使用了公有类和私有类的设计,把没必要公开的声明放到私有头文件里,避免了编译时引入过多代码。而MFC没有这样的设计。
至于大家感觉MFC快主要原因是MFC工程默认打开了编译预处理头文件(PCH),但是这是VC编译器的特性,所有C++程序都可以用,不是MFC特有,Qt也可以使用 PCH
方法很简单,在你的 pro 文件中加入一行
PRECOMPILED_HEADER = stableh
指定 Stableh这个头文件作为编译预处理文件,MFC里这个文件一般叫stdafxh
然后在 stableh里 包含你所用到的所有 Qt 头文件,如果你用了很多qt的类可以直接包含所有
比如 :
#include <QtCore>
#include <QtGui>
这两个文件里又包含了几乎所有Qt常用类
不用担心,即使包含了所有头文件也没关系,有了PCH再多头文件也没影响。
如果你还想编译再快点,可以在 pro里加入下面一行
QMAKE_CXXFLAGS += /MP
指定/mp编译选项,编译器将使用并行编译,同时起多个编译进程并行编译不同的cpp
而且QT这种引入PCH的方法比MFC的好,由于MFC的PCH选项是每个工程逐个指定的,很容易被某些人搞坏,我曾经无数次修复PCH问题,但是Qt的选项是写在pro里的,写一次就永远不会错。
MFC一旦弄坏了PCH,编译也慢得令人发指。
给个参考时间吧,YY最新版本大约 100多万行C++代码,rebuild debug和releae总共需要20多分钟,机器是i5 四核SSD硬盘。其实对于大项目硬盘才是瓶颈,如果换机械硬盘要慢差不多70%,有个同事用10G内存做了个内存盘编译,还能快30%。
需要安装VC++运行组件。VC++运行库一键安装是一款MicrosoftVisualCRedistributable的VC++运行库合集32位/64位整合版,MicrosoftVisualC++运行库,保证采用MicrosoftVisualStudio20XX、qt编写的软件能够正常运行。
以上就是关于qt调试窗口没有定义的变量全部的内容,包括:qt调试窗口没有定义的变量、如何从零基础开始学习QT平台开发_qt学习之路、QT 如何实现最终对硬件的控制等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)