Qt实现基本QMainWindow主窗口程序

1.打开Qt creator新建MainWindow工程。

2、右键工程名添加新文件,main文件,后缀自动补全后为main.cpp。

3、选中工程,再次右键,选择模板的时候选择C++类,添加一个MainWindow类,该类继承字QMainWindow。

4、添加一个mainwindow.qrc资源文件

代码部分:

main.cpp

#include <QtGui/QApplication>
#include "mainwindow.h"
 
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
 
 
    return a.exec();
}
 
 

注:

1、在qmake工程中,默认情况下已经包含了QtCore和QtGui模块,因此无须配置就可以使用这两个模块中的类。若不想使用QtGui模块,而仅仅使用QtCore,就可以在qmake工程文件中通过使用"QT-=gui"来取消QtGui模块的包含。 

2、一般应用程序中通过#include<QtGui/QtGui>来包含整个QtGui模块的所有类的头文件,其中第一个QtGui是模块名,第二个QtGui是QtGui模块(文件名)下的预定义头文件;

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QtGui>
 
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~MainWindow();
 
    void createMenus();     //创建菜单
    void createActions();   //创建动作
    void createToolBars();  //创建工具栏
    void createStatusBar(); //创建状态栏
public slots:
    void sl_NewFile();
    void sl_OpenFile();
    void sl_SaveFile();
    void sl_Copy();
    void sl_Cut();
    void sl_Paste();
    void sl_About();
protected:
    void loadFile(QString);
//声明了用于实现主窗口所需的各种元素
 
private:
    QMenu *fileMenu;
    QMenu *editMenu;
    QMenu *aboutMenu;
 
    QToolBar *fileTool;
    QToolBar *editTool;
 
    QAction *fileOpenAction;
    QAction *fileNewAction;
    QAction *fileSaveAction;
    QAction *exitAction;
 
    QAction *copyAction;
    QAction *cutAction;
    QAction *pasteAction;
 
    QAction *aboutAction;
    QLabel *tipLabel;
 
    QTextEdit *edtText;
};
 
#endif // MAINWINDOW_H
 
 

注:

1、#ifndef MAINWINDOW_H
#define MAINWINDOW_H
防止重复包含头文件,与 #endif // MAINWINDOW_H 结合使用才完整

2、Q_OBJECT宏对于所有使用了信号/槽机制的类而言是必须要的,同时它要求放置在类声明的开始处。

3、在这里我声明了一部分类的槽,这里我把它定义为公有,返回类型均为void。
public slots:
    void sl_NewFile();
    void sl_OpenFile();
    void sl_SaveFile();
    void sl_About();
需要注意的是,槽同时可以被当作普通函数被调用,这时它的返回值对于我们而言与调用一个普通的C++函数产生的返回值并无差别。而当槽作为一个信号的响应函数而被执行时,它的返回值会被程序忽略。也就是说,不使用信号,我们也可以正常调用槽函数来完成一些事情。以下是声明了槽和为声明槽的使用区别:
//"打开"动作
    fileOpenAction = new QAction(QIcon("E:/Qt/MainWindow/open.png"),tr("Open"),this);
    fileOpenAction->setShortcut(tr("Ctrl+0"));
    fileOpenAction->setStatusTip(tr("open a file"));
    connect(fileOpenAction,SIGNAL(triggered()),this,SLOT(sl_OpenFile()));

//"剪切"动作
    cutAction = new QAction(QIcon("E:/Qt/MainWindow/cut.gif"),tr("cut"),this);
    cutAction->setShortcut(tr("Ctrl+X"));
    cutAction->setStatusTip("cut to clipboard");
    connect(cutAction,SIGNAL(triggered()),this,SLOT(cut()));


mainwindow.cpp

#include "mainwindow.h"
#include <QTextStream>
#include <QFile>

MainWindow::MainWindow(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    //设置主窗口标题
    setWindowTitle(tr("QMainWindow"));
    //this指针表示其父窗口为主窗口MainWindow
    edtText = new QTextEdit(this);
    //设置主窗口的中心窗口部件为edtText
    setCentralWidget(edtText);

    createActions();
    createMenus();
    createToolBars();
    createStatusBar();
}

MainWindow::~MainWindow()
{

}

void MainWindow::createActions()
{
    //"打开"动作
    fileOpenAction = new QAction(QIcon(":/images/open.png"),tr("Open"),this);
    fileOpenAction->setShortcut(tr("Ctrl+o"));
    fileOpenAction->setStatusTip(tr("open a file"));
    connect(fileOpenAction,SIGNAL(triggered()),this,SLOT(sl_OpenFile()));

    //"新建"动作
    fileNewAction = new QAction(QIcon(":/images/new.gif"),tr("New"),this);
    fileNewAction->setShortcut(tr("Ctrl+N"));
    fileNewAction->setStatusTip(tr("new file"));
    connect(fileNewAction,SIGNAL(triggered()),this,SLOT(sl_NewFile()));

    //"保存"动作
    fileSaveAction = new QAction(QIcon(":/images/save.png"),tr("Save"),this);
    fileSaveAction->setShortcut(tr("Ctrl+S"));
    fileSaveAction->setStatusTip(tr("save file"));
    connect(fileSaveAction,SIGNAL(activated()),this,SLOT(sl_SaveFile()));

    //"退出"动作
    exitAction = new QAction(tr("Exit"),this);
    exitAction->setShortcut(tr("Ctrl+Q"));
    exitAction->setStatusTip(tr("exit"));
    connect(exitAction,SIGNAL(triggered()),this,SLOT(close()));

    //"剪切"动作
    cutAction = new QAction(QIcon(":/images/cut.gif"),tr("cut"),this);
    cutAction->setShortcut(tr("Ctrl+X"));
    cutAction->setStatusTip("cut to clipboard");
    connect(cutAction,SIGNAL(triggered()),this,SLOT(cut()));

    //"复制"动作
    copyAction = new QAction(QIcon(":/images/copy.png"),tr("copy"),this);
    copyAction->setShortcut(tr("Ctrl+C"));
    copyAction->setStatusTip("copy to clipboard");
    connect(copyAction,SIGNAL(triggered()),this,SLOT(copy()));

    //"粘贴"动作
    pasteAction = new QAction(QIcon(":/images/paste.gif"),tr("paste"),this);
    pasteAction->setShortcut(tr("Ctrl+V"));
    pasteAction->setStatusTip("paste clipboard to selection");
    connect(pasteAction,SIGNAL(triggered()),this,SLOT(paste()));

    //"关于"动作
    aboutAction = new QAction(tr("About"),this);
    connect(aboutAction,SIGNAL(triggered()),this,SLOT(sl_About()));
}

void MainWindow::createMenus()
{
    //文件菜单
    fileMenu = menuBar()->addMenu(tr("File"));
    fileMenu->addAction(fileNewAction);
    fileMenu->addAction(fileOpenAction);
    fileMenu->addAction(fileSaveAction);
    fileMenu->addSeparator();
    fileMenu->addAction(exitAction);

    //编辑菜单
    editMenu = menuBar()->addMenu(tr("Edit"));
    editMenu->addAction(copyAction);
    editMenu->addAction(cutAction);
    editMenu->addAction(pasteAction);

    //帮助菜单
    aboutMenu = menuBar()->addMenu(tr("Help"));
    aboutMenu->addAction(aboutAction);
}

void MainWindow::createToolBars()
{
    //文件工具栏
    fileTool = addToolBar("File");
    fileTool->addAction(fileNewAction);
    fileTool->addAction(fileOpenAction);
    fileTool->addAction(fileSaveAction);
    fileTool->setAllowedAreas(Qt::TopToolBarArea | Qt::LeftToolBarArea);
    fileTool->setMovable(false);

    //编辑工具栏
    editTool = addToolBar("Edit");
    //addToolBar(Qt::RightToolBarArea,editTool);
    //editTool->setMovable(true);
    //editTool->setAllowedAreas(Qt::RightToolBarArea);
    //editTool->setFloatable(true);
    //QSize size(16,15);
    //editTool->setIconSize(size);
    editTool->addAction(copyAction);
    editTool->addAction(cutAction);
    editTool->addAction(pasteAction);
}

void MainWindow::createStatusBar()
{
    tipLabel=new QLabel(tr("ready"));
    tipLabel->setAlignment(Qt::AlignHCenter);
    tipLabel->setMinimumSize(tipLabel->sizeHint());
    statusBar()->addWidget(tipLabel);
}

void MainWindow::sl_NewFile()
{
    MainWindow *newWin = new MainWindow;
    newWin->show();
}

void MainWindow::sl_OpenFile()
{
    QString fileName = QFileDialog::getOpenFileName(this);
    if(!fileName.isEmpty())
    {
        if(edtText->document()->isEmpty())
        {
            loadFile(fileName);
        }
        else
        {
            MainWindow *newWin = new MainWindow;
            newWin->show();
            newWin->loadFile(fileName);
        }
    }
}

void MainWindow::sl_SaveFile()
{

}

void MainWindow::sl_About()
{

}

void MainWindow::loadFile(QString fileName)
{
    QFile file(fileName);
    if(file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QTextStream textStream(&file);
        while (!textStream.atEnd())
        {
            edtText->append(textStream.readLine());
        }
    }
}



 
 
 注: 

1、setWindowTitle是继承自QWidget的方法,它的原型是void setWindowTitle(const QString &)。QMainWindow是继承自QWidget的,所以QWidget的公有方法在QMainWindow中也有。

2、在程序中需要使用字符串操作时,尽量使用tr()函数,这使得程序可以被翻译为多种语言。




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值