Qt를 이용하여 Gui와 Cli를 둘 다 사용할 수 있는 프로그램 작성하려합니다.

pkh0104의 이미지

안녕하세요.
Qt로 Gui와 Cli를 병용할 수 있도록 하려고 합니다.
두가지를 같은 Process 내에서 구현하는 것을 목표로 하였고요.
Gui는 QMainwindow와 QDialog를 사용하였고, Cli는 while문 내에서 readline()으로 command string을 받아오도록 작성하였습니다.

그런데, 이 두가지를 main.cpp에서 같은 QApplication 내에 함께 사용했을 경우 컴파일은 제대로 되지만
실행 했을 때, gui창이 제대로 뜨지 않는 문제가 발생하였습니다.
main.cpp에서 Cli 부분을 마스크 시켰을 때는 Gui창이 제대로 뜨고요.
(혹시나 해서 while loop를 해제 했는데 처음 실행시켰을 때(readline()에서 입력 대기중)에는 같은 현상이었고, 엔터키 누르고 cui부분이 끝난 다음 gui창이 제대로 떴습니다.)
이거 해결해보려고 구글링도 해보고 여기저기 찾아다녔지만 이 문제에 대해 언급한 곳이 없더라구요. ㅠ.ㅠ
해결방법이나 조언을 부탁드립니다.

제가 작성한 코드는 아래와 같습니다.

************* main.cpp ***********

int main(int argc, char **argv)
{
   QApplication mi(argc, argv, TRUE);
 
   MainWindow *guiobj = new MainWindow();
   guiobj->setMinimumSize(800,600);
   guiobj->show();
   guiobj->showChild();
 
   CliPrompt *clithread = new CliPrompt(); //원래 이부분을 QOject로 구현을 했었습니다.(같은 현상 발생)
   clithread->start();
   clithread->wait();
   if(!clithread->running())
	   exit(0);
 
   mi.connect(&mi, SIGNAL(lastWindowClosed()), &mi, SLOT(quit()));
   return mi.exec();
}

*********** cliprompt.h ***********

class CliPrompt : public QThread
{
	public:
		char *prompt;
		char *command;
	public:
		CliPrompt();
		int getCommand();
 
	private:
		void run();
};

*********** cliprompt.cpp ***********

 CliPrompt::CliPrompt()
 {
 	command = new char[10];
 	prompt = "\ntest> ";
 }
 
 int CliPrompt::getCommand()
 {
 	command = readline(prompt);
 	printf("Gotten Command : %s", command);
 
 	if(strcmp(command,"exit") == 0)
 	{
 		printf("\n");
 		return 0;
 	}
 	else
 		return 1;
 }
 
 void CliPrompt::run()
 {
 	int retGetCmd = 0;
 
 	while(true)
 	{
 		retGetCmd = getCommand();
 		if(retGetCmd == 0)
 			break;	
 	}
 }

*********** mainwindow.h ***********

class QAction;
class QLabel;
class Child;
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0, const char *name = 0, 
				WFlags f = WType_TopLevel);
 
	void showChild();
 
protected:
    void closeEvent(QCloseEvent *event);
    void contextMenuEvent(QContextMenuEvent *event);
 
private slots:
    void about();
	void showChildSlot();
 
private:
    void createActions();
    void createMenus();
    void createStatusBar();
 
    Child *child;
    QLabel *locationLabel;
    QLabel *formulaLabel;
    QLabel *modLabel;
 
    QPopupMenu *helpMenu;
    QPopupMenu *setupMenu;
 
    QAction *childAct;
    QAction *aboutAct;
    QAction *aboutQtAct;
};

*********** mainwindow.cpp ***********

MainWindow::MainWindow(QWidget *parent, const char *name, WFlags f)
    : QMainWindow(parent, name, f)
{
	child = new Child(this);
 
    createActions();
    createMenus();
    createStatusBar();
 
    setCaption(tr("UNISDK"));
}
 
void MainWindow::showChild()
{
	if(child->isHidden())
	{
		child->show();
	}
	else
	{
		child->raise();
		child->setActiveWindow();
	}
}
 
void MainWindow::createActions()
{
	childAct = new QAction(tr("&child"), 0, this);
	childAct->setStatusTip(tr("Open run status window"));
	connect(childAct, SIGNAL(activated()), this, SLOT(showChildSlot()));
 
    aboutAct = new QAction(tr("&About"), 0, this);
    aboutAct->setStatusTip(tr("Show the application's About box"));
    connect(aboutAct, SIGNAL(activated()), this, SLOT(about()));
 
    aboutQtAct = new QAction(tr("About &Qt"), 0, this);
    aboutQtAct->setStatusTip(tr("Show the Qt library's About box"));
    connect(aboutQtAct, SIGNAL(activated()), qApp, SLOT(aboutQt()));
}
 
void MainWindow::createMenus()
{
    helpMenu = new QPopupMenu(this);
    aboutAct->addTo(helpMenu);
    aboutQtAct->addTo(helpMenu);
 
	setupMenu = new QPopupMenu(this);
	childAct->addTo(setupMenu);
 
    menuBar()->insertItem(tr("&Setup"), setupMenu);
    menuBar()->insertItem(tr("&Help"), helpMenu);
}
 
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
    QPopupMenu contextMenu(this);
    contextMenu.exec(event->globalPos());
}
void MainWindow::closeEvent(QCloseEvent *event)
{
        event->accept();
}
 
void MainWindow::createStatusBar()
{
    formulaLabel = new QLabel(this);
    statusBar()->addWidget(formulaLabel, 1);
}
 
void MainWindow::about()
{
    QMessageBox::about(this, tr("About child"),
            tr("<h2>child 1.0</h2>"
               "<p>Copyright &copy; 2003 Software Inc."
               "<p>child is a small application that "
               "demonstrates <b>QAction</b>, <b>QMainWindow</b>, "
               "<b>QMenuBar</b>, <b>QStatusBar</b>, "
               "<b>QToolBar</b>, and many other Qt classes."));
}
 
void MainWindow::showChildSlot()
{
 
	if(!child->isVisible())
	{
		child->show();
		child->raise();
		child->setActiveWindow();
	}
}

환경은
redhat linux 9.0
qt 3.3
입니다.

감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.