追寻梦想的路

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  因项目需要编写一个上位机软件,前段时间刚接触Qt,觉着这个框架类库会比MFC更好用,并且具有跨平台的特性,所以采用Qt5.2写了一个基于串行通讯的调试上位机。

  遇到的主要问题:

1、串口能接收数据,但接收速度很慢,工作不正常?

问题:程序只在开始的时候设置了COM口和参数,但是如果预设的COM口不存在,那么新设置好com口后,并没有再次进行初始化操作,所以会导致串口工作不正常。

2、窗口布局如何是空间跟随主窗口的大小变化而变化?

首先sizepolicy要采用 “Expanding”模式;

其次,使用gridlayout spacer groupbox等空间,先从整体上布局,再着眼于细节,一层一层的布局即可。同时还需要注意有些控件大小需要设置成fixed固定长度。

3、中文显示问题?

目前试了两种方法

  1. :QStringLiteral
setWindowTitle(QStringLiteral("我是中文"));
QTextCodec *codec = QTextCodec::codecForName("GB18030");
setWindowTitle(codec->toUnicode("我是中文"));

4、程序打包发布问题

新版本的Qt自带了一个文件打包工具windeployqt.exe ,路径在D:\Qt\msvc32\bin下。我们可以使用其为我们找到exe所依赖的dll文件。

  • 添加环境变量: path D:\Qt\msvc32\bin,如此才能在cmd命令中使用windeplot.exe 程序。
  • 改变cmd路径到exe所在路径 cmd命令行中输入: cd /d D:\SerialPort
  • 路径修改完成后,在cmd中输入命令 windeployqt myCom.exe,运行完后会发现exe所需的dll文件已经查找完毕并添加到了exe所在文件夹中
  • 使用Depends软件查找可能还缺少的dll文件(黄色感叹号的就是缺少的dll),将缺失的dll添加到exe所在文件夹中
  • 将所有需要的dll文件查找完毕后,使用enigma virtual box软件打包exe+dll文件,生成一个独立的exe文件。
  • 将生成的exe在其他电脑上运行测试,如果没有问题,表示打包成功。

5、Qt界面更新后运行出来的结果界面并没有更新

mainwindow.ui 编译生成的ui_mainwidow.h文件位置不对,导致引用的是旧版.h界面,所以会导致界面显示未更新。解决办法:删除原来的.h文件,clear-> qmake->rebuild,OK!

6、怎么实现自动搜索串口功能?

一开始呢,是使用Qextserialportenumerator来做的,结果呢,这个文件运行需要.lib文件,于是我就开始在VS中配置终于生成了lib文件(后来发现直接把.cpp .h文件加到现在工程不就可以了么。。。绕了个大弯,坑爹),然而并没有能够搜索到系统已有的串口,一直显示零个串口。于是在网上找其他方法,结果发现在Qt5中自带QtSerialPort类和QSerialPortInfo类,前者用于设置串口,读出数据等,后者用于枚举出系统已有的串口。got it,Qt的安装包example中有各种关于串口操作的例程,运行后发现可以枚举出系统已有串口,问题解决。

文件地址:D:\Qt\Examples\Qt-5.4\serialport

7、图片显示?

(1)添加Resource -> picture.png

(2)点击resource 中的图片,右键 copy path,即可以获得图片的相对地址。

 

 

对应程序:

void MainWindow::Init_COM()
{
    QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts();
    QStringList strList;
    strList.clear();

    QChar *serialNum =  new QChar [ports.size()];
    //get the number in array
    for (int i = 0; i < ports.size(); i++) {

      serialNum[i] = ports.at(i).portName().at(3);
    }

//    //Bubble_Sort
    for (int j = ports.size()-1; j>0; j--) {
            for(int i=0;i<j;i++)
            {
                if(serialNum[i]>serialNum[i+1])
                {
                      QChar temp = serialNum[i];
                      serialNum[i] = serialNum[i+1];
                      serialNum[i+1] = temp;
                }
            }
    }
    //set the COMx
    for(int i=0;i<ports.size();i++)
    {
        strList.append(QString::number(serialNum[i].toLatin1()-0x30));
    }

    ui->comCombo->clear();
    ui->comCombo->addItems(strList);
    //显示下拉菜单
    ui->comCombo->showPopup();
    free(serialNum);
}

  

 8、环境变量设置问题

由于更改了环境变量,导致Qt工程无法编译。这里主要是系统环境变量设置问题

打开 计算机-属性-高级设置-环境变量设置

编辑

INCLUDE C:\Program Files (x86)\Microsoft Visual Studio\VC98\atl\include;C:\Program Files (x86)\Microsoft Visual Studio\VC98\mfc\include;C:\Program Files (x86)\Microsoft Visual Studio\VC98\include;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\
PATH C:\Windows\System32\;C:\Qt\Qt5.4.1\5.4\msvc2013\bin\;C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\;C:\Qt\Qt5.4.1\Tools\QtCreator\bin\;C:\Qt\Qt5.4.1\5.4\msvc2013\bin\;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\
LIB C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\
VS120COMNTOOLS C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\
VCINSTALLDIR C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\

主要设置C:\Windows\System32\     C:\Qt\Qt5.4.1\5.4\msvc2013\bin\等,

如果提示cl不是内部命令也不是外部命令时,表明path环境变量设置有误,可以通过cmd命令框中输入ipconfig 等命令来测试,如果显示不是内部或外部命令,则表明环境变量设置有误,那么需要在path中重新正确设置参数。

 

9、如何在多窗口之间共享数据?

  1. signal/slot方法,在一个dialog中定义signals,在mainwindow中接收,并编写槽函数,注意connect建立之间一定要初始化dlg对象。
  2. signals函数不能有返回值,并且不能有实现,slot函数的参数不能比signals函数的参数多。
  3. signals/slot是Qt中用于消息传递的一种策略。
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //信号槽方式下父子窗体传值的测试
    dlg = new Dialog2();
    //dlg->show();
    //关联信号和槽函数
    connect(dlg,SIGNAL(SendString(QString)),this,SLOT(SetString(QString)));
   // dlg->setModal(true); 不论是模态或者非模态都可以正常传值
    //dlg->show();
}
MainWindow::~MainWindow()
{

}

void MainWindow::on_pushButton_clicked()
{
     dlg->show();
     qDebug() << "open a new dialog succeed" << endl;
}
void MainWindow::SetString(QString str)
{
    ui->textEdit->setText("Hello");
    qDebug() << "signal received" << endl;
}
class Dialog2 : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog2(QWidget *parent = 0);
    ~Dialog2();
signals:
    void SendString(QString str);
private slots:
    void on_buttonBox_accepted();

private:
    Ui::Dialog2 *ui;
};

 

 

 

界面如如下:

 

附源码:https://files.cnblogs.com/files/wll-zju/%281%29SerialPort%E5%8A%A0%E5%85%A5%E6%8C%87%E7%A4%BA%E7%81%AF%EF%BC%8C%E4%B8%B2%E5%8F%A3%E8%87%AA%E5%8A%A8%E6%90%9C%E7%B4%A2%E5%8A%9F%E8%83%BD.zip

开发环境:VS2013 32bit + Qt5.2.1 32bit

posted on 2015-08-04 22:38  追寻梦想的路  阅读(834)  评论(0)    收藏  举报