240305

Yonggeun Park·2024년 3월 5일
0

Linux Qt

목록 보기
2/5

led % 비율 설정할 때 (정수/실수)의 형태인데,
이 경우 정수는 4바이트, 실수는 8바이트라서 자동으로 정수를 실수로 형변환해준다
-> 실수/실수 형태가 되어버림


위의 내용을 추가함으로써 창을 늘렸을 때 재배치하면서 조절함

파이에서 실행할 때
mknod, insmod 두개를 하고 실행해야함
만약 insmod를 안했는데 lsmod에 있으면 빌트인 커널이므로 잘못된 것


이제 타이머를 해볼 것이다
전역으로 사용하기 때문에 클래스의 멤버변수로 넣는다

   pQTimer = new QTimer(this);

    connect(ui->pPBtimerStart, SIGNAL(clicked(bool)), this, SLOT(timerStartSlot(bool)));
    
void Tab1DeviceControl::timerStartSlot(bool bCheck)
{
    if(bCheck)
    {
        QString strValue = ui->pCBtimerValue->currentText();  // 50, 100 등 숫자는 문자열이다
        pQTimer->start(strValue.toInt());    // 가져온 문자열을 정수로 변환한다
        ui->pPBtimerStart->setText("Timer Stop");
    }
    else
    {
        pQTimer->stop();
        ui->pPBtimerStart->setText("Timer Start");
    }
}

led처럼 cpp에 미리 선언해주고, 함수까지 추가한 뒤

#include <QTimer>

private:
    void timerStartSlot(bool);

헤더에도 포함한다

근데 이 상태에서 실행하면 실행 중에 콤보박스의 숫자를 조절해도 변경된 값으로 타이머를 조절하지 않는다

connect(ui->pCBtimerValue, SIGNAL(currentIndexChanged(QString)), this, SLOT(timerValueChangedSlot(QString)));

cpp에 이 내용을 추가해주고 위에서 한 내용처럼 헤더와 함수선언을 한다

void Tab1DeviceControl::timerValueChangedSlot(QString strValue)
{
    if(pQTimer->isActive())
    {
        pQTimer->stop();
        pQTimer->start(strValue.toInt());
    }
}

이제 key를 이용해볼 것이다

connect(pKeyLed, SIGNAL(updateKeydataSig(int)), this, SLOT(keyCheckBoxSlot(int)));

늘 하던대로 cpp에 입력하고 헤더에 선언하고 함수로 만든다

void Tab1DeviceControl::keyCheckBoxSlot(int keyNo)
{
//    qDebug() << "KeyNo" << keyNo;
    static int lcdData = 0;
    lcdData ^= (0x01 << (keyNo - 1));
    ui->pLcdNumberKey->display(lcdData);

    QCheckBox * pQCheckBoxArray[8] = {ui->pCBKey1, ui->pCBKey2, ui->pCBKey3, ui->pCBKey4,
                                      ui->pCBKey5, ui->pCBKey6, ui->pCBKey7, ui->pCBKey8};
    for (int i=0;i<8;i++)
    {
        if(keyNo == i + 1)
        {
            if(pQCheckBoxArray[i]->isChecked())
                pQCheckBoxArray[i]->setChecked(false);
            else
                pQCheckBoxArray[i]->setChecked(true);
        }
    }
}

Tab2에 소켓통신을 넣어볼 것이다

nfs에 파일을 복사하여 넣고, 실행한 뒤
form에 add로 Tab2TcpSocket으로 생성한다

pro에

QT       += network 

추가 해야한다

mainwidget.h에

#include "tab2tcpsocket.h"

    Tab2TcpSocket *pTab2TcpSocket;

추가하고

cpp에

    pTab2TcpSocket = new Tab2TcpSocket(ui->pTab2);
    ui->pTab2->setLayout(pTab2TcpSocket->layout());

추가한다

mainwidget의 tabWidget의 이름을 pTabWidget으로 변경 후
cpp에서

    ui->pTabWidget->setCurrentIndex(0);

추가한다

안되면 clean all 하고 rebuild 해본다


label, push button 2개로 다음과 같이 만들고
hbox로 묶는다
6,2,2로 설정했음

text edit 1개와 line edit 2개를 가져온다
line edit 2개는 hbox에 넣고
맨 오른쪽에 push button을 하나 넣는다
2,7,2

이렇게 만들어졌고 오브젝트 이름을 변경해준다


ipc_socket의 server.c 파일을 수정한다


우선 소켓 통신이 가능하다


go to slot으로 함수를 만들고, clicked(bool)로 만든다

void Tab2TcpSocket::on_pPBserverConnect_clicked(bool checked)
{
    bool bOk;
    if(checked)
    {
        pSocketClient->slotConnectToServer(bOk);
        if(bOk)
        {
            ui->pPBserverConnect->setText("서버해제");
            ui->pPBsendButton->setEnabled(true);
        }
    }
    else
    {
        pSocketClient->slotClosedByServer();
        ui->pPBserverConnect->setText("서버연결");
        ui->pPBsendButton->setEnabled(false);
    }
}

ui에서 checkable 한다

추가로 다음 내용으로 추가한다 tap2.cpp

connect(pSocketClient, SIGNAL(sigSocketRecv(QString)), this, SLOT(sockedRecvUpdateSlot(QString)));

헤더도 추가해주고
함수도 추가한다

void Tab2TcpSocket::sockedRecvUpdateSlot(QString strRecvData)
{
    ui->pTErecvData->append(strRecvData);
    ui->pTErecvData->moveCursor(QTextCursor::End);
}

화면에 줄로 로그를 띄우고
화면에 꽉 차면 아래로 스크롤바가 생긴다
그런데 \n이 추가되어있는데, 이것을 제거하겠다

strRecvData.chop(1);

맨 마지막 1문자를 제거하겠다는 뜻
앞에가 좀 밋밋하니까 시간을 넣어보겠다
tab2.h에

#include <QTime>

추가한 함수는

void Tab2TcpSocket::sockedRecvUpdateSlot(QString strRecvData)
{
    strRecvData.chop(1);
    QTime time = QTime::currentTime();
    QString strTime = time.toString();

    strTime = strTime + " " + strRecvData;
    ui->pTErecvData->append(strTime);
    ui->pTErecvData->moveCursor(QTextCursor::End);
}

이렇게 되고
업로드중..
이렇게 보인다


이제 메시지로 led 제어를 하려한다
이 내용을 추가하려면 바로 위의 함수를 수정해야한다
문자열을 꺼내와서 분리해야하므로
먼저, 대괄호를 @로 치환한다

    strRecvData.replace("[", "@");
    strRecvData.replace("]", "@");
    QStringList qlist = strRecvData.split("@");

[PYG_QT]LED@0xff 라고 입력할 때
이렇게하면 qlist[0] = null
qlist[1] = PYG_QT
qlist[2] = LED
qlist[3] = 0xff
가 등록된다

//    if(strRecvData.index0f("LED"))
    if(qlist[2]=="LED")
    {
        bool bOk;
        int ledNo = qlist[3].toInt(&bOk, 16);
        if(bOk)
        {
            emit ledWriteSig(ledNo);
        }
    }

함수에 이렇게 추가해주고
시그널을 등록한다

signals:
    void ledWriteSig(int);

이후 mainwidget.cpp에 가서 tab1의 dial값을 바꾸려한다
근데 private이라 접근할 수 없다(ui->pDialLed 가 안된다는 뜻)
그래서 get 함수를 만들어서 호출해야한다
mainwidget.cpp에 만들어두고

   connect(pTab2TcpSocket, SIGNAL(ledWriteSig(int)), pTab1DeviceControl->getpDialLed(), SLOT(setValue));

tab1.h에 정의하고

#include <QDial>

public:
    QDial * getpDialLed();

tab1.cpp에 함수 선언한다

QDial * Tab1DeviceControl::getpDialLed()
{

}

아까 빼먹은 송신 키를 살려보려한다
ui에 가서 송신 키를 go to slot - clicked()로 선택한다
그리고 아까 잘못적은 pLErecvData를 pLEsendData로 수정한다
다시 컴파일

void Tab2TcpSocket::on_pPBsendButton_clicked()
{
    QString strRecvId = ui->pLErecvId->text();
    QString strSendData = ui->pLEsendData->text();

    if(!strSendData.isEmpty())
    {
        if(strRecvId.isEmpty())
            strSendData = "[ALLMSG]" + strSendData;
        else
            strSendData = "[" + strRecvId + "]" + strSendData;
        pSocketClient->slotSocketSendData(strSendData);
        ui->pLEsendData->clear();
    }
}

함수를 위와 같이 만든다

이번에 keyupdate를 할 것이다
pKeyled도 private라서 get함수로 접근한 뒤 받아와야 한다

connect(pTab1DeviceControl->getpKeyled(),SIGNAL(updatekeyledSig(int)), pTab1DeviceControl->getpDialLed(), SLOT(setValue(int)));

위의 tab2.cpp 부분 만든 것에
헤더에 getKeyled()함수를 선언하고
함수를 tab2.cpp다음과 같이 만든다

KeyLed * Tab1DeviceControl::getpKeyled()
{
    return pKeyled;
}
profile
Dragon_muscle

0개의 댓글

관련 채용 정보