QtNote:QTcpSocket、Qt位運算、QTableView、QLineEdit焦點問題

開門見山,這裏是QtNote。
注意,本文中的全部代碼均取自我寫的ModBus程序,閱讀時請適當忽略上下文。編程


QTcpSocket

因爲項目須要,我須要使用ModBus TCP協議與RTU通訊,因此須要使用套接字。
套接字的使用如今只是實現了特定的功能,容錯性什麼的暫時沒有考慮。網絡

Socket編程的步驟就是鏈接-》發送消息-》接收消息(出錯處理)。
QT對Socket進行了封裝,封裝爲了QTcpSocket類,調用這個類的connectToHost函數便可對目標進行一次鏈接嘗試。(若是鏈接不上會返回鏈接錯誤)
我寫了一個本身的MyTcp,在這個類裏面有一個QTcpSocket變量。
經過Qt的信號與槽的機制,將消息發送成功與接收消息綁定在一塊兒。tcp

connect(&tcpSocket, SIGNAL(readyRead()), this, SLOT(ReadData()));

經過學習我知道了TCP協議氛圍,ModBus是面向行的,一行內的信息是使用QByteArray編輯的(參照發送消息的函數)。
發送消息使用以下函數ide

void MyTCP::SendRequest(qint8 slaveaddress, qint8 functioncode, qint16 startaddress, qint16 datanumber)
{
    QByteArray line;
    QDataStream out(&line, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_DefaultCompiledVersion);
    out << qint8(00) << qint8(00) << qint8(00) << qint8(00);//protocal identifier 4byte
    qint16 messagelen = sizeof(slaveaddress) + sizeof(functioncode) + sizeof(startaddress) + sizeof(datanumber);
    out << messagelen;//High 8-bit ModBus & Low 8-bit message length
    out << slaveaddress;//slave address
    out << functioncode;//function code
    out << startaddress;//High 8-bit & Low 8-bit of start address
    out << datanumber;//High 8-bit & Low 8-bit of data number
    tcpSocket.write(line);
     
}

注,這裏都是針對ModBus發送的信息。能夠參照我翻譯的RTU文檔(還未翻譯完)。
接收消息以下。函數

void MyTCP::ReadData()
{
    QDataStream in(&tcpSocket);
    in.setVersion(QDataStream::Qt_DefaultCompiledVersion);
    qint64 availabelnum = tcpSocket.bytesAvailable();
    QByteArray res = tcpSocket.readAll();
}

Qt位運算

因爲Modbus返回的信息都是特定格式的字節數據,有的數據會分爲高低兩塊,因此須要位運算來將數據合併。其實這裏叫C++位運算更合適一點。下面是位運算操做符。佈局

"&"與
"|"或
">>"右移
"<<"左移

下面是一個高位與低位合併的函數:學習

qint16 MyTCP::Combine(qint8 high, qint8 low)
{
    return (high << 8 | low);
}

QTableView

注:本部分摘自網絡,由於ModBus只用到了其中一部分,不全。
添加表頭:ui

QStandardItemModel  *model = new QStandardItemModel();
model->setColumnCount(2);
model->setHeaderData(0,Qt::Horizontal,QString::fromLocal8Bit("卡號"));
model->setHeaderData(1,Qt::Horizontal,QString::fromLocal8Bit("姓名"));

設置表格屬性:this

ui->tableView->setModel(model);
//表頭信息顯示居左
ui->tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
//設置列寬不可變
ui->tableView->horizontalHeader()->setResizeMode(0,QHeaderView::Fixed);
ui->tableView->horizontalHeader()->setResizeMode(1,QHeaderView::Fixed);
ui->tableView->setColumnWidth(0,101);
ui->tableView->setColumnWidth(1,102);

注:在進行表格設置時必須是「ui->tableView->setModel(model);」在前,屬性具體設置在後,翻譯

反之則設置不會生效。如上述代碼所示。

添加行(添加三行同樣的信息):

for(int i = 0; i < 3; i++)
 {
     model->setItem(i,0,new QStandardItem("2009441676"));
        //設置字符顏色
     model->item(i,0)->setForeground(QBrush(QColor(255, 0, 0)));
        //設置字符位置
     model->item(i,0)->setTextAlignment(Qt::AlignCenter);
     model->setItem(i,1,new QStandardItem(QString::fromLocal8Bit("哈哈")));
 }

刪除行:

//x是指定刪除哪一行
model->removeRow(x);
//刪除全部行
model->removeRows(0,model->rowCount());

QLineEdit焦點問題

通常若是可以使用Tab鍵來更換焦點的話會很方便,我發現QLineEdit自帶了Tab鍵的響應,或者說是MainWindow,具體機制沒有研究。
我進行了佈局以後Tab鍵順序混亂了,而後我發現了問題在ui_modbus.h文件裏面,先上代碼。

SlaveAddress = new QLineEdit(centralWidget);
        SlaveAddress->setObjectName(QStringLiteral("SlaveAddress"));
        SlaveAddress->setFocusPolicy(Qt::StrongFocus);

        gridLayout->addWidget(SlaveAddress, 0, 1, 1, 1);

        FuntionCode = new QLineEdit(centralWidget);
        FuntionCode->setObjectName(QStringLiteral("FunctionCode"));

        gridLayout->addWidget(FuntionCode, 1, 1, 1, 1);

        StartAddress = new QLineEdit(centralWidget);
        StartAddress->setObjectName(QStringLiteral("StartAddress"));

        gridLayout->addWidget(StartAddress, 2, 1, 1, 1);

        DataNumber = new QLineEdit(centralWidget);
        DataNumber->setObjectName(QStringLiteral("DataNumber"));

        gridLayout->addWidget(DataNumber, 3, 1, 1, 1);

        OKButton = new QPushButton(centralWidget);
        OKButton->setObjectName(QStringLiteral("OKButton"));

        gridLayout->addWidget(OKButton, 4, 1, 1, 1);

添加的順序就是光標移動的順序。即SlaveAddress->FunctionCode->StartAddress->DataNumber->OKButton。其實這並非QLineEdit獨有的,QPushButton也能夠。而後我還發現了選中OKButton按鈕以後按Enter鍵沒有反應,按Space卻是響應了。

相關文章
相關標籤/搜索