1. 程式人生 > 實用技巧 >qt筆記 combox下拉複選框 strcpy越界bug

qt筆記 combox下拉複選框 strcpy越界bug

再次接觸qt,這次得細緻的學習學習

1  專案有問題可以先清除專案,再執行qmake,再三角

2  報lnk2019等,可以先想想是不是dll庫沒有加進來,可以用右鍵的方式新增lib或者dll庫,系統在.pro中自動生成程式碼,不會出錯,

   然後將dll庫加入到exe所在檔案中,(release或者debug檔案時不一樣的)

3  qt對位操作非常不友好,c與運算不起作用,我有個地方需要將字串轉成16進位制輸出

  eg:a對應的ascii應該是97對應16進位制應該是61,我需要61,可以直接用.tohex檔案輸出.

  eg:  QByteArray info="aa";  info.toHex()的輸出結果就是6161  

4  combox加下拉複選框

 (1)介面上加入一個combox按鈕,然後引入標頭檔案

#include <QCheckBox>
(2)在標頭檔案中引入
#include <QListWidget>
(3)標頭檔案加入
QListWidget *m_workshopListWidget;
(4)在cpp中構造檔案加入
m_workshopListWidget = new QListWidget(this);
    m_workshopListWidget->setObjectName(QString("listWidget_wkshop"));

    for(int i=0; i< 5; i++)
    {
    QListWidgetItem *item = new QListWidgetItem();
    m_workshopListWidget->addItem(item);
    QCheckBox *chkBox = new QCheckBox();
    chkBox->setText("test1");

    m_workshopListWidget->setItemWidget(item, chkBox);
    connect(chkBox,SIGNAL(stateChanged(int)),this,SLOT(slot_stateChanged()));
    }
    ui->comboBox->setModel(m_workshopListWidget->model());
    ui->comboBox->setView(m_workshopListWidget);
    ui->comboBox->setEditable(true);
(5)新增槽函式
void  Widget::slot_stateChanged()
{
    QString str ;
    for ( int i= 0 ; i<5 ; i++ )
    {
        QListWidgetItem *item = m_workshopListWidget->item(i);
        QCheckBox *box = (QCheckBox*)m_workshopListWidget->itemWidget(item);
        if ( box->checkState() == Qt::Checked )
        {
            str += box->text();
            str += ",";
        }
    }
    str = str.mid(0,str.size()-1);
    if(str == QString(""))
    {
        str = QStringLiteral("選擇車間");
    }
}
不一定能用,但是一定可以顯示,然後按照自己的想法修改成自己想要的就可以了

5  char*,QString,QByteArray轉換  參考https://blog.csdn.net/qq_33485434/article/details/78790285
  QString轉char*  
    QString  str;   char*  ch;  QByteArray ba = str.toLatin1();     ch=ba.data();
   
6 qt使用strcpy竟然越界了,之前使用都沒事兒,這個問題倒騰我半個小時,還沒找到問題,請教別人才知道是strcpy存在野指標問題,可能導致記憶體越界,最終結局就是程式崩潰.這個是隱藏bug,以後不使用strcpy統一使用strncpy來代替
  對於qt有個更好的代替方式,使用qstrncpy


7  設定qlineedit區間範圍
 ui->dataNoGasCloseDays->setValidator(new QIntValidator(0,255,this));

8  設定路徑為相對位置
imagesPath = QCoreApplication::applicationDirPath().left(QCoreApplication::applicationDirPath().lastIndexOf("/"))+"/images/";
    ui->comIcon->setPixmap(QPixmap(imagesPath+"comDown.png"));
9  設定主介面背景圖
   QPalette pal = this->palette();
    pal.setBrush(QPalette::Background,QBrush(QPixmap(imagesPath+"bg.jpg").scaled(this->size())));
    this->setPalette(pal);

10  註冊資訊在main中判斷,之後在register中利用定時器再次判斷可以實現功能註冊碼錯誤開啟軟體直接提示,不用定時器也可以,不過qmessage窗體會不按照規定移動,至今未找到接解決方法

11  登錄檔使用方法
  QSettings *reg = new QSettings("HKEY_CURRENT_USER\\Software\\Tools\\meterTools", QSettings::NativeFormat);//確定路徑(key)
    reg->setValue(ui->machineCode->text(),ui->registerCode->text());//確定註冊的key的值名稱和值資料
    QString registervalue = reg->value(ui->machineCode->text()).toString();//讀取key的值名稱對應的值資料,然後用某個函式判斷值名稱和值資料對不對,不對則報錯,對則繼續.

   //處理判斷邏輯
  delete reg;//最後刪掉,節省空間
12  登錄檔中包含了系統和硬體之間的連結,很重要,被刪了,系統可能無法啟動,由一層一層的key組成.

13  QMessageBox有個很神奇的地方,顯示中文會亂碼,查資料可能是程式編碼不一致,使用QStringLiteral可能導致中文亂碼,我程式碼介面輸入四個漢字,實際介面顯示六個字亂碼,
推測懷疑程式碼使用三位元組編譯一個漢字,而顯示介面使用兩位元組顯示一個漢字,結果出現六個漢字QStringLiteral修改成QString::fromUtf8竟然好了,了,了(之前是不行的)
QMessageBox::information(this,QString::fromUtf8("註冊錯誤"),QString::fromUtf8("註冊錯誤註冊碼過期,請輸入最新註冊碼"));