qt筆記 combox下拉複選框 strcpy越界bug
阿新 • • 發佈:2020-09-10
再次接觸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("註冊錯誤註冊碼過期,請輸入最新註冊碼"));