2011-04-18 6 views
0

학기 시험실 시험을 위해 우리는 다른 카테고리의 모든 프로그램을 나열하고 하나를 클릭 할 때 열리는 GUI를 만들어야합니다. 저는 GUI 프로그래밍을 잘 모르지만 C++의 기초를 알고 있으며 Qt가 시작하기에 좋은 선택이라고 생각했습니다. QtCreator로 작업 중이며 꽤 매끄러운 도구처럼 보입니다.기본 GUI를 디자인하기 위해 Qt 시작하기 도움말

내가 달성하고자하는 것은 버튼을 클릭 할 때 주 윈도우가 숨겨져 있어야하고 해당 카테고리의 윈도우가 필요한 프로그램을 실행할 위치에서 표시되어야한다는 것입니다. QWidget에서 MainWidget과 ProcessWidget을 상속받은 두 개의 다른 클래스를 사용하여 주 윈도우와 프로세스 관리 카테고리를 각각 사용하고 있습니다. 다른 카테고리의 위젯을 추가 할 계획이지만 이러한 개별 위젯을 어떻게 붙일 수 있을지는 명확하지 않습니다.

내가 선택한 디자인 선택은 적절하지 않으며, 적절한 디자인 선택을 확신하지 못합니다. 이것에 관한 도움을 많이 주시면 감사하겠습니다, 내가 사용하고있는 모든 파일의 내용은 아래에 첨부되어 있습니다.

homewidget.h

#ifndef HOMEWIDGET_H 
#define HOMEWIDGET_H 

#include <QtGui/QWidget> 

#include <QVBoxLayout> 
#include <QHBoxLayout> 
#include <QLabel> 
#include <QPushButton> 
#include "processwidget.h" 

class HomeWidget : public QWidget 
{ 
    Q_OBJECT 

private: 
    QVBoxLayout *main_layout; 
    QHBoxLayout *footer; 
    QLabel *header,*footer_text; 
    QPushButton *process_mgt,*file_mgt; 
    QWidget *target; 

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

private slots: 
    void process_management_slot(QWidget *qw); 
}; 

#endif // HOMEWIDGET_H 

homewidget.cpp

#include "homewidget.h" 

HomeWidget::HomeWidget(QWidget *parent) 
    : QWidget(parent) 
{ 
    main_layout = new QVBoxLayout(); 
    footer = new QHBoxLayout(); 
    header = new QLabel("<i>MCA Semester 2</i>\nOS LAB Record"); 
    footer_text = new QLabel("Made By :\n\t Nikhil Bhardwaj"); 
    process_mgt = new QPushButton("Process Management"); 
    file_mgt = new QPushButton("File Management"); 

    setWindowTitle("Operating Systems Lab, MCA NITT 2011"); 
    footer->addStretch(); 
    footer->addWidget(footer_text); 

    main_layout->addWidget(header); 
    main_layout->addStretch(); 
    main_layout->addWidget(process_mgt); 
    main_layout->addWidget(file_mgt); 
    main_layout->addStretch(); 
    main_layout->addLayout(footer); 
    setLayout(main_layout); 
    connect(process_mgt,SIGNAL(clicked()),this,SLOT(process_management_slot(process_widget))); 
} 

HomeWidget::~HomeWidget() 
{ 

} 

void HomeWidget::process_management_slot(QWidget *qw) 
{ 
    this->hide(); 
    target = qw; 
    target->show(); 
} 

processwidget.h

#ifndef PROCESSWIDGET_H 
#define PROCESSWIDGET_H 

#include <QWidget> 
#include <QVBoxLayout> 
#include <QHBoxLayout> 
#include <QLabel> 
#include <QPushButton> 

class ProcessWidget : public QWidget 
{ 
    Q_OBJECT 
private: 
    QVBoxLayout *process_layout; 
    QHBoxLayout *process_footer; 
    QLabel *process_header,*process_footer_text; 
    QPushButton *back,*scheduling,*synchronization,*bankers; 
public: 
    ProcessWidget(QWidget *parent = 0); 

signals: 

public slots: 

}; 

#endif // PROCESSWIDGET_H 

processwidget.cpp

#include "processwidget.h" 

ProcessWidget::ProcessWidget(QWidget *parent) : 
    QWidget(parent) 
{ 
    process_layout = new QVBoxLayout(); 
    process_footer = new QHBoxLayout(); 
    process_header = new QLabel("<i>MCA Semester 2</i>\nOS LAB Record"); 
    process_footer_text = new QLabel("Made By :\n\t Nikhil Bhardwaj"); 
    back = new QPushButton("Main Menu"); 
    scheduling = new QPushButton("Scheduling Algorithms"); 

    setWindowTitle("Operating Systems Lab, Process Management"); 
    process_footer->addStretch(); 
    process_footer->addWidget(process_footer_text); 

    process_layout->addWidget(process_header); 
    process_layout->addStretch(); 
    process_layout->addWidget(scheduling); 
    process_layout->addWidget(back); 
    process_layout->addStretch(); 
    process_layout->addLayout(process_footer); 
    setLayout(process_layout); 
} 
,

MAIN.CPP

#include <QtGui/QApplication> 
#include <QVBoxLayout> 
#include <QHBoxLayout> 
#include <QLabel> 
#include <QPushButton> 
#include "homewidget.h" 
#include "processwidget.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    HomeWidget *main_widget = new HomeWidget(); 
    ProcessWidget *process_widget = new ProcessWidget(); 
    main_widget->show(); 

    return a.exec(); 
} 

마지막 final_gui.pro

#------------------------------------------------- 
# 
# Project created by QtCreator 2011-04-15T06:37:21 
# 
#------------------------------------------------- 

QT  += core gui 

TARGET = final_gui 
TEMPLATE = app 


SOURCES += main.cpp\ 
     homewidget.cpp \ 
    processwidget.cpp 

HEADERS += homewidget.h \ 
    processwidget.h 

나는 내 문제를 설명에서 명확하지 않은 경우 명확히하기 위해보다 더 행복을 수 있습니다.

답변

1

QStackedWidget (http://doc.qt.nokia.com/latest/qstackedwidget.html)을 살펴보십시오. QStackedWidget을 윈도우의 기본 위젯으로 만든 다음 HomeWidget과 ProcessWidget을 QStackedWidget에 넣으면 표시되는 위젯을 전환 할 수 있습니다.

+0

이것은 매우 유망한 것으로 보입니다. 하지만 정확히 어떻게 위젯을 전환합니까? – nikhil

+1

필자가 링크 된 문서에서 (예제도 제공합니다), setCurrentIndex 또는 setCurrentWidget 함수를 사용합니다. 대부분의 경우 이러한 슬롯 중 하나를 컨트롤 중 하나에서 방출되는 신호에 연결합니다. – Colin

0

저는 ProcessWidget이 전혀 필요 없다고 생각합니다. MainWidget (주로 이름, 작업 설명 등의 실험실 속성 지정)이 필요할 수도 있습니다.

QFileDialog을 사용하여 실행 파일 (또는 원하는 파일 형식)을 검색 할 수 있습니다.

이 파일을 실행하려면 QProcess을 사용할 수 있습니다.

주어진 클래스에 대한 Qt 참조는 다른 사람에게 더 많은 정보를 줄 수 있습니다.

+0

아니요, 실행 파일을 검색하고 싶지 않습니다. 나는 이미 경로를 알고 있습니다. 내가 달성하고자하는 것은 MainWidget의 Button을 클릭 할 때 ProcessWidget을 열 수있는 것입니다. 모든 다른 카테고리에 대해 몇 가지 위젯을 추가하고 클릭 할 때 시작하고 싶습니다. 각각의 버튼을 클릭하면 메인 윈도우가 닫힙니다. – nikhil