본문 바로가기
대외활동/한화비전 VEDA

0805 QT C++ 다양한 ui, 시그널

by hoshi03 2024. 8. 5.

• QT 시작

qt console app 으로 프로젝트 시작

cmake 빌드

 

-프로젝트 생성해서 디버그 찍어보기

#include <QCoreApplication>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug("Hello Qt");
    qDebug() << "test!";
    return a.exec();
}

 

- 온클릭 이벤트

#include <QApplication>
#include <QLabel>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    QLabel hello("<font color = red> Hello <i>Qt!</i> </font>",&w);
    hello.resize(75,35);
    QPushButton quit("quit",&w);
    quit.move(10,40);
    quit.resize(75,35);
    QObject::connect(&quit, &QPushButton::clicked,
                     &hello,[&](){hello.setText("<b>Hi</b>");});
    w.show();
    return a.exec();
}

 

- signal로 값 전달하기

 

인자 값을 전달하려면 람다식을 사용해서 넘겨줘야 한다...

아니면 넘기려는 인자가 0~9면 함수 10개를 만들어줘야 하는 어지러운 상황

 

 

#include "mainwindow.h"
#include <QApplication>
#include <QLCDNumber>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QLCDNumber *lcd = new QLCDNumber();

    lcd->setSegmentStyle(QLCDNumber::Filled);
    lcd->setBinMode();
    lcd->setDigitCount(14);
    lcd->display(1512);
    lcd->show();
    return a.exec();
}

 

 

-- 프로그레스바를 만들고 특정 퍼센트에 도달하면 멈추게 하기

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QProgressBar* progBar = new QProgressBar();
    progBar->setRange(0, 100);
    progBar->show();

    QTimer timer;
    int n = 0;
    QObject::connect(&timer,&QTimer::timeout,[&]{
        progBar->setValue(++n%101);
        if(progBar->value() == 84) timer.stop();
    });

    timer.start(5);

    return a.exec();
}

 

--qt로 html 파일 열기

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextBrowser *tb = new QTextBrowser();
    tb->setSource(QUrl("index.html"));
    tb->show();
    return a.exec();
}

 

--토글 버튼 만들기

toggle는 눌리면 true, 다시 눌리면 false를 리턴한다

누르면 디버그에 toggled를 리턴하고 다시 누르면 quit가 되는 버튼

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QPushButton *pushButton = new QPushButton("Push&Button",0);
    pushButton->setCheckable(true);
    QObject::connect(pushButton, &QPushButton::toggled,[&](bool flag){qDebug() << "toggled";
    if(!flag) a.quit();});
    pushButton->show();
    return a.exec();
}

 

-단축문자
Button 앞에 들어간 &는 B를 단축문차로 사용가능하게 한다

alt + 단축문자로 버튼을 누른 효과를 낼 수 있다 

QPushButton *pushButton = new QPushButton("Push&Button",0);

-숏컷

pushButton->setShortcut(QKeySequence("ctrl+c"));

QkeySeqence("숏컷 단축키"); 형태로 만들어두면 해당 키를 눌럿을때 버튼을 누른 효과를 낼 수 있다

 

-- 이미지 추가하기

프로젝트 우클릭 - qt resource 파일 추가

qrc 파일 생성돤거를 클릭해서 prefix에 add files로 이미지 파일 추가

pushButton->setIcon(QIcon(":/resource/android.png"));

 

qt에서는 ":"를 상위 경로로 쓰는 것 같다

이미지를 아이콘으로 넣어 줄 수 있다

 

-- 라디오버튼

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QRadioButton>
#include <QButtonGroup>

class QRadioButton;
class QButtonGroup;

class widget : public QWidget
{
    Q_OBJECT



public:
    widget(QWidget *parent = 0);
    ~widget();

private:
    QLabel *label;
    QRadioButton *radiobtn[4];
    QButtonGroup *buttonGroup;
};


#endif // WIDGET_H

widget.cpp 라디오버튼에 이름 넣어주고 클릭시 해당 번호 버튼 클릭되었다고 해주기

#include "widget.h"
#include <QRadioButton>
#include <QButtonGroup>


widget::widget(QWidget *parent) : QWidget(parent){
    resize(140,110);
    buttonGroup = new QButtonGroup(this);
    for (int i = 0; i < 4; i++) {
        QString str = QString("RadioButton") + QString::number(i+1);
        radiobtn[i] = new QRadioButton(str,this);
        radiobtn[i]->move(10,10+20*i);
        buttonGroup->addButton(radiobtn[i]);
    }

    connect(buttonGroup, &QButtonGroup::buttonClicked, [=](){

        for(int i = 0; i < 4; i++){
            if(radiobtn[i]->isChecked()){
                qDebug() << i+1 << "btn clicked";
            }
        }
    });
}

widget::~widget() {
    // 소멸자에서 특별히 할 일은 없지만, 명시적으로 정의
}

 

메인

using namespace std;


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    widget w;
    w.show();
    return a.exec();
}

 

 

-- 슬라이더

#include <QApplication>
#include <QLabel>
#include "widget.h"
#include <QSlider>
#include <QStyleFactory>

using namespace std;


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QSlider *slider = new QSlider();
    slider->setOrientation(Qt::Horizontal);
    slider->setTickPosition(QSlider::TicksAbove);
    slider->setStyle(QStyleFactory::create("Fusion"));
    slider->show();

    return a.exec();
}

 

--다이얼

다이얼 돌리면 현재 값을 가져오는 코드

#include <QApplication>
#include <QDial>

using namespace std;


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QDial *dial = new QDial();
    dial->setWrapping(true);

    dial->show();

    QObject::connect(dial, &QDial::valueChanged,[=](){
        qDebug() << dial->value();
    });

    return a.exec();
}

 

-- 스핀박스

#include <QApplication>
#include <QSpinBox>

using namespace std;


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QSpinBox *spin = new QSpinBox();
    spin->setRange(0,10);
    spin->setSuffix("%");
    spin->setWrapping(true);
    spin->setSpecialValueText("parcento");
    spin->show();

    QObject::connect(spin, &QSpinBox::valueChanged, [=](){
        qDebug() << spin->value();
    });

    return a.exec();
}

 

-- LineEdit, 자동완성

#include <QApplication>
#include <QLineEdit>
#include <QCompleter>

using namespace std;


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QLineEdit *line = new QLineEdit();
    QStringList list;
    list << "test" << "aaaaa" << "bbbbb" << "ccccc";
    QCompleter *completer = new QCompleter(list,line);

    completer->setCaseSensitivity(Qt::CaseInsensitive);
    line->setCompleter(completer);
    line->show();

    return a.exec();
}

 

-- 입력받은게 특정 qstring 값과 같으면 출력

#include <QApplication>
#include <QLineEdit>
#include <QCompleter>
#include <Qstring>

using namespace std;


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QLineEdit *line = new QLineEdit();
    line->show();
    QString pw = "testpw";
    QObject::connect(line,&QLineEdit::editingFinished,[=]{
        QString get = line->text();
        if(get == pw) qDebug() << get;
    });
    return a.exec();
}

 

--레이아웃

 

QVBoxLayout - 버티컬

QHBoxLayout - 호리즌탈

#include "widget.h"
#include <QVBoxLayout>
#include <QPushButton>

widget::widget(QWidget *parent) : QWidget(parent){
    QPushButton * btn1 = new QPushButton();
    btn1->setText("btn1");
    QPushButton * btn2 = new QPushButton("btn2");
    QPushButton * btn3 = new QPushButton("btn3",this);
    QVBoxLayout * layout = new QVBoxLayout();
    layout->setSpacing(6);
    layout->addWidget(btn1);
    layout->addWidget(btn2);
    layout->addWidget(btn3);
    setLayout(layout);
}

 

-- 그리드 레이아웃

 

#include "widget.h"
#include <QtWidgets>
#include <QPushButton>

widget::widget(QWidget *parent) : QWidget(parent){
    QStringList labels;
    labels << "&IP" << "&PW" << "&Date";
    QLineEdit* line[3];
    QString ans[3] = {"testid", "testpw", "test"};
    QFormLayout* layout = new QFormLayout;
    for (int i = 0; i < 3; ++i) {
        line[i] = new QLineEdit(this);
        layout->addRow(labels.at(i),line[i]);

        connect(line[i], &QLineEdit::editingFinished, [=](){
            if (line[i]->text() == ans[i]) qDebug() << "success";
        });
    }

    QGroupBox* box = new QGroupBox("&login", this);
    box->move(5,5);
    box->setLayout(layout);
    resize(box->sizeHint().width()*2,box->sizeHint().height()*2);
}

 

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QRadioButton>
#include <QButtonGroup>
#include <QCheckBox>

class widget : public QWidget
{
    Q_OBJECT

public:
    widget(QWidget *parent = 0);


private:
    QLabel *label;
};


#endif // WIDGET_H

 

--QTabWidget

 

탭 여러개 만들기

#include "widget.h"
#include <QtWidgets>
#include <QPushButton>

widget::widget(QWidget *parent) : QWidget(parent){
    QDial *dial = new QDial(this);
    QCalendarWidget* cal = new QCalendarWidget(this);
    QTextEdit* te = new QTextEdit("tab 3", this);

    QTabWidget *tw = new QTabWidget(this);
    tw->addTab(dial,"Tab&1");
    tw->addTab(cal,"Tab&2");
    tw->addTab(te,"Tab&3");
    resize(tw->sizeHint());
}

'대외활동 > 한화비전 VEDA' 카테고리의 다른 글

0808 Qt 메세지박스, 자료구조  (0) 2024.08.08
0807 QT 에디터 & 액션  (0) 2024.08.07
modern c++  (0) 2024.07.31
스마트 포인터  (0) 2024.07.31
예외 처리  (0) 2024.07.31