Qt 프로그래밍 단축키(Shortcut) 만드는 방법

Qt 프로그래밍 단축키(Shortcut) 만드는 방법

Author : Jino Bae / Send Mail

단축키는 개인적으로 프로그램의 진입장벽을 높이는 것이라고 생각한다. 단축키가 많은 프로그램은 어렵다는 고정 관념이 있다. 만약 당신이 사용하는 프로그램이 단축키로만 사용할 수 있다고 생각해 본다면 사용하고 싶을까? 그렇지 않을 것이다.

그럼에도 단축키는 꼭 필요한 기능이다. 다시 만약 당신이 쓰는 프로그램에 단축키가 하나도 없다고 생각해 본다면 사용하고 싶을까? 그것도 그렇진 않을 것이다. 밸런스가 중요하다.



QKeySequence

#include <QShoutcut>

new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_R), this, SLOT(Function()));

먼저 단축키를 사용하기 위해 불러와야 하는 헤더파일은 QShortcut이며 사용법은 3행에 적혀진 코드와 같다. 지금은 2가지 키가 조합된 것이며 +를 빼고 단일 단축키로 만들어도 무방하다.


정확한 코드의 사용법을 위해서 자그마한 프로그램을 함께 만들어 보도록 하자. 만들어질 프로그램은 위와같은 스톱워치 프로그램이며 오직 단축키로만 만들어 질 예정이다.





Programing

필요한 레이아웃은 단지 레이블 1개이다.



private:
    Ui::MainWindow *ui;
    QTimer *timer;
    int h,m,s;

private 멤버는 timer와 h, m, s가 필요하다. timer는 스톱워치 프로그램이니 기본적으로 필요하며 h, m, s는 레이블 안에 들어갈 시간 변수다. 이미 눈치를 챘겠지만 시, 분, 초이다.



private slots:
    void TimeReset();
    void StartInterval();
    void StopInterval();
    void setTime();
    void setTimeLabel();

private slots의 함수는 시간을 초기화하는 함수, timer를 start로 바꿔줄 함수, timer를 stop으로 바꿔줄 함수, 그리고 timer가 흐를때 시간이 증가될 함수와 시간이 흐르면 레이블을 수정해 줄 함수가 필요하다.



    timer = new QTimer();
    connect(timer,SIGNAL(timeout()),this,SLOT(setTime()));
    h=0;m=0;s=0; setTimeLabel();

    new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Z), this, SLOT(StartInterval()));
    new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_X), this, SLOT(StopInterval()));
    new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_C), this, SLOT(TimeReset()));

메인 윈도우의 생성자에 포함된 소스코드이다. 2행connect 함수를 이용해서 timer와 setTime을 묶었다. 3행시, 분, 초를 각각 0으로 초기화하고 레이블의 내용을 초기화 시킨다. 그리고 Z, X, C키를 각각의 함수와 연결시켰다.





각각의 함수의 기능을 구현하자.

void MainWindow::setTime()
{
    s++;
    if(s>59){
        s=0;
        m++;
    }
    if(m>59){
        m=0;
        h++;
    }
    setTimeLabel();
}

timer 변수가 timeout()이 될때마다 초단위 변수가 증가하며 시계의 알고리즘에 맞춰 각각의 변수에 영향을 미치며 12행시간을 표시할 레이블을 계속해서 호출한다.



void MainWindow::setTimeLabel()
{
    QString time = QString::number(h) + " : " + QString::number(m) + " : " + QString::number(s);
    ui->label->setText(time);
}

레이블에 시간을 표시한다. int형을 String형태로 받아오기 위해선 위와같이 3행QString::numer(Inteager)형태로 사용해야 한다.



void MainWindow::StartInterval()
{
    timer->start(10);
}

void MainWindow::StopInterval()
{
    timer->stop();
}

void MainWindow::TimeReset()
{
    s=0;m=0;h=0;
    setTimeLabel();
}

그리고 각각의 Ctrl + Z, X, C 단축키에 들어갈 함수들이다. 내용이 매우 간단해서 한꺼번에 묶었다. 3행QTimer::start()함수에 들어가는 아규먼트는 msec단위이다. 여기서는 시간이 빠르게 흐르는 것을 보여주기 위해서 이와같이 작성되었다.



shortcut.zip

▲ 작성된 프로그램(Source Code)




Jino Bae
WRITTEN BY

Jino Bae

Digital is a purely man-made playground. That's why I like.
im@baejino.com


comments powered by Disqus