天天看點

Linux下開發Qt界面程式時指令行傳參數的一個坑

今天在Linux下開發Qt界面程式時發現一個奇怪的問題,程式執行如下指令卻會列印日志和彈出對話框

./test -name xxx
           

代碼如下:

#include <QApplication>
#include <QMessageBox>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    if(argc != 3 || strcmp(argv[1], "-name") != 0)
    {
        qDebug() << "param not right!";
        QMessageBox::warning(NULL, "提示", QString("指令行格式:./test -name 姓名"));
        return -1;
    }
    ...
    return 0;
}
           

在Windows上是不會進入if判斷的,但在Linux下卻會進入到if判斷内。通過添加列印資訊:

...
    qDebug() << "1.argc=" << argc;
    QApplication a(argc, argv);
    qDebug() << "2.argc=" << argc;
    if(argc != 3 || strcmp(argv[1], "-name") != 0)
    ...
           

Linux下輸出結果是:

1.argc=3
2.argc=1
           

Windows下輸出結果是:

1.argc=3
2.argc=3
           

這是為啥?問題肯定出在QApplication構造函數裡。通過在百度裡搜尋“Qt QApplication 預設參數 -name”發現一篇文章提到了如下内容:

Linux下開發Qt界面程式時指令行傳參數的一個坑

原來是X11的指令行預設處理了"-name"參數,在此記錄一下在Linux下進行Qt (Qt 4,沒有驗證Qt5是否存在此問題)開發時,注意避免傳入參數與X11指令行選項沖突或者在QApplication構造前對參數進行處理。

繼續閱讀