QT Programming Simple Editor
|
½Ç½À ¿¹Á¦ : °£´ÜÇÑ ÅØ½ºÆ® ÆíÁý±â ÀÛ¼º
ÅØ½ºÆ® ÆÄÀÏÀ» Àоîµé¿© QTextEdit¿¡ ¾²°í ÅØ½ºÆ®¸¦ ÆÄÀÏ·Î ÀúÀåÇÏ´Â ±â´ÉÀ» ±¸ÇöÇÕ´Ï´Ù.
![]() [JPG image (49.35 KB)] QDialog¿¡ QTextEdit ÄÁÆ®·Ñ°ú Spacer¸¦ ÀÌ¿ëÇÏ¿© µðÀÚÀÎÇÕ´Ï´Ù. Spacer¿Í QTextEditÀ» À§¿¡¼ºÎÅÍ ¼ø¼´ë·Î Ãß°¡ÇÑ ÈÄ FormÀ» ¼±ÅÃÇÑ »óÅ¿¡¼ ¸Þ´ºÀÇ Layout->Lay out vertically¸¦ ¼±ÅÃÇÏ¿© Á¤·ÄÇÕ´Ï´Ù. spacer´Â ÀÏÁ¾ÀÇ ¹öÆÀ¸ñ °°Àº °ÍÀ¸·Î ÀÏÁ¤°ø°£À» È®º¸Çϱâ À§ÇØ Ãß°¡ÇÏ´Â ÄÁÆ®·ÑÀÔ´Ï´Ù. ¿©±â¿¡¼´Â µ¿ÀûÀ¸·Î »ý¼ºÇÒ QMenuBarÀÇ °ø°£À» È®º¸Çϱâ À§ÇØ »ç¿ëÇÕ´Ï´Ù.
Form»ý¼º½Ã¿¡ ¸Þ´º¹Ù¸¦ »ý¼ºÇϰí SpacerÀÇ Å©±â¸¦ ÀçÁ¶Á¤Çϵµ·Ï ÇÕ´Ï´Ù.
void Form_Main::Initialize()
{
//---------------------------------------------------------------------------------------------------
//local variables :
//---------------------------------------------------------------------------------------------------
QMenuBar* pMenuBar = NULL;
QPopupMenu *pPopupMenu = NULL;
QRect rect;
//---------------------------------------------------------------------------------------------------
//
// ¸ÞÀÎ ¸Þ´º¸¦ Ãß°¡ÇÑ´Ù.
//
pMenuBar = new QMenuBar(this , NULL); //¸Þ´º ¹Ù °´Ã¼¸¦ »ý¼ºÇÑ´Ù.
rect = pMenuBar->geometry(); //¸Þ´º ¹ÙÀÇ Å©±â¸¦ ±¸ÇÑ´Ù.
spacer_menu->changeSize( rect.width() , rect.height() ); //spacerÀÇ Å©±â¸¦ ¸Þ´º ¹ÙÀÇ Å©±â·Î ÇÑ´Ù.
this->repaint(true); //À©µµ¿ì¸¦ ´Ù½Ã ±×¸°´Ù.
/*
*¸Þ´º ¹ÙÀÇ ¸Þ´º ±¸¼ºÀº ÆË¾÷ ¸Þ´ºµéÀÇ ÁýÇÕÀ¸·Î ³ªÅ¸³ª´Ù. QPopupMenu°´Ã¼¸¦ »ý¼ºÇÑ ÈÄ QPopupMenu °´Ã¼¿¡
*¸Þ´º ¾ÆÀÌÅÛ(Ç׸ñ)À» Ãß°¡ÇÑ ÈÄ QMenuBar¿¡ QPopupMenu°´Ã¼¸¦ Ãß°¡ÇÏ¸é µÈ´Ù.
*/
//"File" ¸Þ´º »ý¼º
pPopupMenu = new QPopupMenu;
pPopupMenu->insertItem("&New" , this , SLOT( menuhandler_file_new() ) , CTRL+Key_N );
pPopupMenu->insertItem("&Open" , this , SLOT( menuhandler_file_open() ) , CTRL+Key_O );
pPopupMenu->insertItem("&Save" , this , SLOT( menuhandler_file_save() ) , CTRL+Key_S );
pMenuBar->insertItem("File" , pPopupMenu ); //»ý¼ºÇÑ ÆË¾÷ ¸Þ´º¸¦ ¸Þ´º¹Ù¿¡ Ãß°¡
return;
}
¸Þ´º¹Ù¿¡ ¸Þ´ºÇ׸ñÀ» Ãß°¡ÇÏ´Â ºÎºÐÀ» È®ÀÎÇϼ¼¿ä.
ÆÄÀÏÀÇ Àбâ¿Í ¾²±â ºÎºÐÀº ½º·¹µå Ŭ·¡½º¿Í ÁøÇà»çÇ×À» º¸¿©ÁÖ´Â ´ÙÀ̾ó·Î±×¹Ú½º¸¦ ÀÌ¿ëÇÏ¿© ±¸ÇöÇÏ¿´½À´Ï´Ù.
void Form_Main::menuhandler_file_open()
{
//---------------------------------------------------------------------------------------------------
//local variables :
//---------------------------------------------------------------------------------------------------
QOpenFileDialog openFileDialog;
QString qstr , qstr2;
QTextCodec* pQTC = NULL;
FileLoadThread workerThread;
Form_Progress form_progress(this ); //ó¸® »óŸ¦ Ç¥ÇöÇϱâ À§ÇÑ ¸Þ¼¼Áö ¹Ú½º
int flags = 0;
//---------------------------------------------------------------------------------------------------
pQTC = QTextCodec::codecForName("utf8");
if( pQTC == NULL )
{
return;
}
flags = openFileDialog.exec(); //¿ ÆÄÀÏÀ» ¼±ÅÃÇϱâ À§ÇÑ ´ÙÀ̾ó·Î±×¸¦ »ý¼ºÇÑ´Ù.
if( flags == QOpenFileDialog::Accepted ) //open ¹öưÀ» ´·¶À» °æ¿ì
{
qstr = openFileDialog.selectedFile(); //ÆÄÀÏ ´ÙÀ̾ó·Î±×¹Ú½º¿¡ ÀúÀåµÈ ÆÄÀÏ À̸§(°æ·ÎÆ÷ÇÔ)À» ¾ò´Â´Ù.
qstr2 = "ÆÄÀÏÀ» ¿©´Â ÁßÀÔ´Ï´Ù.";
qstr2 = pQTC->toUnicode( qstr2 );
form_progress.Initialize(qstr , qstr2 ,&workerThread);
//ÆÄÀÏÀ» ÀоîµéÀÌ´Â ½º·¹µå °´Ã¼¸¦ »ý¼ºÇÏ°í ½º·¹µå¸¦ ½ÇÇà½ÃŲ
workerThread.set_FilePath(qstr);
workerThread.start();
form_progress.exec();
if( workerThread.get_WorkFinished() > 0 )
{
this->textEdit_main->setText( workerThread.get_LoadedTextString() );
}
}
else //cancel¹öưÀ» ´·¶À» °æ¿ì
{
return;
}
}
QFileDialog¸¦ »ó¼ÓÇÑ OpenFileDialog¸¦ ÀÌ¿ëÇÏ¿© ÆÄÀÏÀÇ °æ·Î¸¦ ¾ò½À´Ï´Ù. ÁøÇà°æ°ú¸¦ ³ªÅ¸³»´Â Form_Progress À©µµ¿ì¿¡¼´Â ½ÇÁ¦·Î ÀÛ¾÷À» ó¸®ÇÏ´Â ½º·¹µå °´Ã¼ workerThread¿¡ ´ëÇÑ Æ÷ÀÎÅÍ ÂüÁ¶¸¦ ÀÌ¿ëÇÏ¿© ÀÛ¾÷ÀÌ ¾î´À Á¤µµ±îÁö ÁøÇàµÇ´ÂÁö È®ÀÎÇÏ¸ç Æû ¾ÈÀÇ QProgressBar¸¦ °»½ÅÇÕ´Ï´Ù. ÀÛ¾÷ÀÌ ¿Ï·áµÇ¸é workerThread->WorkFinished °ªÀ» È®ÀÎÇϰí Á¾·áµË´Ï´Ù. exec()·Î »ý¼ºµÈ ´ÙÀ̾ó·Î±×âÀº done()À» ÀÌ¿ëÇÏ¿© Á¾·áÇÏ´Â °ÍÀ» È®ÀÎÇϼ¼¿ä.
#include < qmessagebox.h >
#include < qpushbutton.h >
#include "asyncworkerthread.h"
void Form_Progress::Initialize(QString& qstr_FileName , QString& qstr_description ,AsyncWorkerThread* pAsyncWorkerThread)
{
QString qstr;
qstr = "Loading ";
qstr += qstr_FileName;
this->setCaption( qstr );
this->textLabel_fileName->setText(qstr_FileName);
this->m_pAsyncWorkerThread = pAsyncWorkerThread;
this->textLabel_description->setText( qstr_description );
startTimer( 100 ); //setTimerÀÇ ´ÜÀ§´Â millisecond(1000ºÐÀÇ 1ÃÊ)
}
void Form_Progress::timerEvent( QTimerEvent* pEvent)
{
if( this->m_pAsyncWorkerThread->get_Percentage() >= 100 && this->m_pAsyncWorkerThread->get_WorkFinished() != 0 )
{
this->progressBar_fileStoring->setProgress( m_pAsyncWorkerThread->get_Percentage() , 100);
this->repaint();
usleep(100000); //ÁøÇà»çÇ×À» º¸¿©ÁÖ±â À§ÇØ »ì¦ ½®´Ù.
this->done(0); //100ÀÌ µÇ¸é Á¾·á
}
else if( this->m_pAsyncWorkerThread->get_WorkFinished() < 0 )
{
QMessageBox::critical( this , this->caption() , "ÀÛ¾÷ Áß ¿À·ù°¡ ¹ß»ýÇÏ¿´½À´Ï´Ù" ); return;
}
else
{
this->progressBar_fileStoring->setProgress( m_pAsyncWorkerThread->get_Percentage() , 100);
return;
}
}
FileSaveThread¿Í FileOpenThread´Â AsyncWorkerThread¸¦ »ó¼Ó¹Þ¾Æ ±¸ÇöµÈ ÆÄÀÏÀ» ÀÐ°í ¾²´Â ÀÛ¾÷À» Çϴ Ŭ·¡½ºÀÔ´Ï´Ù. AsyncWorkerThread´Â QtÀÇ ½º·¹µå ±¸ÇöÀÎ QThread¸¦ »ó¼Ó¹Þ¾Æ ÀÛ¾÷ÀÇ ÁøÇà Á¤µµ¿Í ¼º°ø¿©ºÎ¸¦ Ç¥ÇöÇÒ ¼Ó¼ºÀ» Ãß°¡ÇÑ Å¬·¡½ºÀÔ´Ï´Ù.
Qt¿¡¼ ½º·¹µå¸¦ »ç¿ëÇϱâ À§Çؼ´Â QThread¸¦ »ó¼Ó¹Þ´Â Ŭ·¡½º¸¦ Á¤ÀÇÇÑ ÈÄ QThread::run() ÇÔ¼ö¸¦ ÀçÁ¤ ÀÇÇÏ°í ±× ¾È¿¡ ½º·¹µå ·çƾÀ» ÀÛ¼ºÇؼ »ðÀÔÇÏ¸é µË´Ï´Ù.
#ifndef _asyncworkderthread_h_
#define _asyncworkderthread_h_
#include < qthread.h >
#define DEFINE_PROPERTY(type,property) type property;type get_##property(){return property;} void set_##property(type value){this->property=value;}
class AsyncWorkerThread : public QThread
{
public:
//
//member variables :
//
//properties :
DEFINE_PROPERTY(int,Percentage)
DEFINE_PROPERTY(int,WorkFinished)
//
//member functions :
//
AsyncWorkerThread(); // »ý¼ºÀÚ
virtual void run(); //»ó¼Ó¹Þ¾Æ¼ ½ÇÁ¦·Î ó¸®ÇÒ ÀÏÀ» »ðÀÔÇÒ ÇÔ¼ö
};
#endif
½º·¹µå´Â QThread::start()ÇÔ¼ö¸¦ È£ÃâÇÔÀ¸·Î¼ ½ÃÀ۵˴ϴÙ. Qt ³»ºÎ¿¡¼ ¹®ÀÚ´Â utf8 Æ÷¸ËÀ¸·Î ÀÎÄÚµùµÇ¾î »ç¿ëµË´Ï´Ù. À̹ø ±¸Çö¿¡¼´Â utf8 ÄÚµ¦À¸·Î ÅØ½ºÆ® ÆÄÀÏÀ» ÀоîµéÀ̰í ÀúÀåÇÕ´Ï´Ù. ÆÄÀÏÀ» ÀоîµéÀÌ´Â ºÎºÐÀÔ´Ï´Ù.
void FileLoadThread::run()
{
QFile qfile;
QByteArray qByteArray;
QTextCodec* pQTC = NULL;
if( FilePath=="")
{
set_WorkFinished(-1);
return;
}
pQTC = QTextCodec::codecForName("utf8");
if( pQTC == NULL )
{
return;
}
qfile.setName( FilePath );
if( qfile.open(IO_ReadOnly) ) //ÆÄÀÏÀ» Àбâ Àü¿ëÀ¸·Î ¿¬´Ù.
{
/*
*À̰÷¿¡¼ ÆÄÀÏÀ» ÀÐ°í ¾²´Â ÀÏÀ» ó¸®ÇÑ´Ù. ÆÄÀÏÀÇ Å©±â¿¡ µû¶ó
*ÀÏÁ¤·®À» ÀоîµéÀÎ ÈÄ set_Percentage()ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ µ¥ÀÌÅ͸¦ ÀоîµéÀÎ ¾çÀ»
*Ç¥½ÃÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
*/
qByteArray = qfile.readAll(); //ÀÌ ±¸Çö¿¡¼´Â Çѹø¿¡ ´Ù ÀоîµéÀδÙ.
set_Percentage(50); //Àý¹ÝÀÌ µÈ°ÍÀ¸·Î Ç¥ÇöÇÑ´Ù.
if( qByteArray.count() > 0 )
{
set_LoadedTextString(pQTC->toUnicode( qByteArray , qByteArray.count() ) );
set_WorkFinished(1);
}
else
{
set_WorkFinished(-1);
}
set_Percentage(100); //Àбâ ÀÛ¾÷ÀÌ ¸ðµÎ ³¡³µ´Ù.
}
return;
}
ÆÄÀÏÀ» ÀúÀåÇÏ´Â ºÎºÐÀÔ´Ï´Ù.
void FileSaveThread::run()
{
QFile qfile;
QTextCodec* pQTC;
pQTC = QTextCodec::codecForName("utf8");
if( pQTC == NULL )
{
return;
}
qfile.setName( get_FilePath() );
if( qfile.open( IO_WriteOnly ) )
{
set_Percentage(0);
QTextStream t(&qfile);
t.setEncoding( QTextStream::UnicodeUTF8);
t << DataString;
qfile.close();
set_WorkFinished(1);
set_Percentage(100);
}
}
µ¿ÀûÀÎ ¸Þ´º »ç¿ë ¹× ÅØ½ºÆ®ÀÇ Àбâ/¾²±â¸¦ ±¸ÇöÇÒ ¶§ À§ Äڵ带 ÂüÁ¶ÇϽñ⠹ٶø´Ï´Ù.
![]() [JPG image (13.25 KB)] ![]() [JPG image (55.72 KB)] ÆÄÀÏÀÌ ÀÐÈù ¸ð½À
![]() [JPG image (46.51 KB)] |
There will be big changes for you but you will be happy. |














