Qt实现自己的IDE

来源:互联网 发布:unity3d fbx没贴图 编辑:程序博客网 时间:2024/05/11 04:03

简易实现了文件操作,编译和运行等功能:

mainwindow.h文件代码:

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>//add控件#include<QTextEdit>//Qt自带的控件#include<QMenu>#include<QMenuBar>#include<QAction>class MainWindow : public QMainWindow{    Q_OBJECTpublic:    MainWindow(QWidget *parent = 0);    ~MainWindow();private:    QString filename;    QString savefilename;private :    QTextEdit *text1;    QMenu *file;    QMenu *edit;    QMenu *build;    QMenu *help;    QAction *file_open;    QAction *file_exit;    QAction *help_about;    QAction *edit_copy;    QAction *edit_cut;    QAction *edit_paste;    QAction *select_all;    QAction *file_save;    QAction *build_compile;    QAction *build_run;private slots:    void on_open();    void on_about();    void on_exit();    void on_copy();    void on_cut();    void on_paste();    void on_selectall();    void on_save();    void on_compile();    void on_run();};#endif // MAINWINDOW_H

main.cpp文件代码:

#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    MainWindow w;    w.resize(800,600);//设置对话框的宽和高    w.show();    return a.exec();}

mainwindow.cpp文件代码:

#include "mainwindow.h"#include "QMessageBox"#include "QFileDialog"MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent){    text1=new QTextEdit;    QFont f;    f.setPixelSize(24);    text1->setFont(f);//设置字体的大小    QColor c;    c.setRgb(160,40,120);    text1->setTextColor(c);//设置字体的颜色    this->setCentralWidget(text1);//将这个控件放到对话框的中间    file=this->menuBar()->addMenu("文件");//在菜单栏中添加菜单项    edit=this->menuBar()->addMenu("编辑");    build=this->menuBar()->addMenu("构建");    help=this->menuBar()->addMenu("帮助");    file_open=new QAction("打开",this);//建立一个action    file_open->setShortcut(tr("Ctrl+O"));//添加 快捷键    file->addAction(file_open);//将file_open这个action加入到file菜单中    file_save=new QAction("保存",this);    file_save->setShortcut(tr("Ctrl+S"));    file->addAction(file_save);    file_exit=new QAction("tuichu",this);    file->addSeparator();//添加分隔符    file->addAction(file_exit);    help_about=new QAction("关于",this);    help_about->setShortcut(tr("Ctrl+H"));    help->addAction(help_about);    edit_copy=new QAction("拷贝",this);    edit->addAction(edit_copy);    edit_cut=new QAction("剪切",this);    edit->addAction(edit_cut);    edit_paste=new QAction("粘贴",this);    edit->addAction(edit_paste);    select_all=new QAction("select all",this);    edit->addAction(select_all);    build_compile=new QAction("编译",this);    build->addAction(build_compile);    build_run=new QAction("运行",this);    build->addAction(build_run);    //Qt的消息槽机制    connect(file_open,SIGNAL(triggered()),this,SLOT(on_open()));    //第一个参数是触发事件的控件,第二个参数是对于Action来说的固定写法    //第三个参数固定写this,第四个参数指定点击Action后执行那个函数    connect(help_about,SIGNAL(triggered()),this,SLOT(on_about()));    connect(file_exit,SIGNAL(triggered()),this,SLOT(on_exit()));    connect(edit_copy,SIGNAL(triggered()),this,SLOT(on_copy()));    connect(edit_cut,SIGNAL(triggered()),this,SLOT(on_cut()));    connect(edit_paste,SIGNAL(triggered()),this,SLOT(on_paste()));    connect(select_all,SIGNAL(triggered()),this,SLOT(on_selectall()));    connect(file_save,SIGNAL(triggered()),this,SLOT(on_save()));    connect(build_compile,SIGNAL(triggered()),this,SLOT(on_compile()));    connect(build_run,SIGNAL(triggered()),this,SLOT(on_run()));}MainWindow::~MainWindow(){    delete text1;}void MainWindow::on_open(){    filename=QFileDialog::getOpenFileName();    //函数返回路径+文件名    if(filename.isEmpty())    {        return;    }    QString content;//QString 是Qt封装的一个字符串类    //QMessageBox::information(this,"提示","test");    //filename.toStdString().data();//这个语句即可将QString类型转化为const char *类型    FILE *p=fopen(filename.toStdString().data(),"r");//需要将QString转换为const char *    if(p==NULL)    {        QMessageBox::information(this,"错误","打开文件失败");    }    else    {        while(!feof(p))        {            char buf[1024]={0};            fgets(buf,sizeof(buf),p);            content+=buf;//将读取到的内容追加到content后面        }      fclose(p);      text1->setText(content);//将字符串的值放到text里面    }}void MainWindow::on_about(){    QMessageBox::information(this,"帮助","Jumfens\n2010-2016");}void MainWindow::on_exit(){    exit(0);}void MainWindow::on_copy(){    text1->copy();}void MainWindow::on_cut(){   text1->cut();}void MainWindow::on_paste(){    text1->paste();}void MainWindow::on_selectall(){    text1->selectAll();}void MainWindow::on_save(){     savefilename=QFileDialog::getSaveFileName();     if(savefilename==NULL)     {         return;     }     FILE *p=fopen(savefilename.toStdString().data(),"w");     if(p==NULL)     {         QMessageBox::information(this,"错误","打开文件失败");         return;     }     else     {        // text1->toPlainText().toStdString().data();//将用户在控件中输入的字符串转化为const char *         fputs(text1->toPlainText().toStdString().data(),p);         fclose(p);     }}void MainWindow::on_compile(){    QString content="#include<stdio.h>\n";    FILE *p=fopen(filename.toStdString().data(),"r");    if(p==NULL)        return;    while(!feof(p))    {        char buf[1024]={0};        fgets(buf,sizeof(buf),p);        content+=buf;    }    fclose(p);    content.replace("111","int").replace("222","main").replace("333","{").replace("444","printf(\"hello jumfens\")").replace("8888","printf(\"\\n\");").replace("555","getchar();").replace("666","return").replace("777","}");    QMessageBox::information(this,"显示",content);    //    return ;    QString destfilename=filename;    destfilename.replace(".e",".c");    p=fopen(destfilename.toStdString().data(),"w");    fputs(content.toStdString().data(),p);    fclose(p);    QString srcname=destfilename;    srcname.replace(".c",".exe");    QString command="gcc -o "+srcname +" "+destfilename;    system(command.toStdString().data());    // remove(destfilename.toStdString().data());    //可以将中间生成的.c文件删除}void MainWindow::on_run(){    QString destfilename=filename;    destfilename.replace(".e",".exe");    system(destfilename.toStdString().data());}
可以输入自己风格的编程语言,然后保存,打开后可以编译生成.c文件,还可以生成.exe文件,最后运行文件。

0 0
原创粉丝点击