1.打开Qt creator新建MainWindow工程。
2、右键工程名添加新文件,main文件,后缀自动补全后为main.cpp。
3、选中工程,再次右键,选择模板的时候选择C++类,添加一个MainWindow类,该类继承字QMainWindow。
4、添加一个mainwindow.qrc资源文件
代码部分:
main.cpp
#include
#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
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
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
#include
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()函数,这使得程序可以被翻译为多种语言。