⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainwindow.cpp

📁 《精通QT4编程》第4章代码整理 加入修改
💻 CPP
字号:
#include <QtGui>#include "mainwindow.h"#include "findfileform.h"CMainWindow::CMainWindow(QWidget* parent) :	QMainWindow(parent){	setupUi(this);		iniDockWidget();	iniStatusBar();	iniConnect();	updateRecentFiles();	showMaximized();		isUntitled = true;	curFile = tr("untitled");	setWindowTitle(curFile + "[*]");	}void CMainWindow::iniDockWidget(){	CFindFileForm* findFileForm = new CFindFileForm;	dockWidget = new QDockWidget(tr("查找文件"), this);	dockWidget->setAllowedAreas(Qt::RightDockWidgetArea);	dockWidget->setFeatures(QDockWidget::AllDockWidgetFeatures);	dockWidget->setFloating(false);	dockWidget->setWidget(findFileForm);	dockWidget->setVisible(true);		addDockWidget(Qt::RightDockWidgetArea, dockWidget);}void CMainWindow::iniStatusBar(){	QStatusBar* bar = statusBar();	label1 = new QLabel;	label1->setMinimumSize(200, 25);	label1->setFrameShadow(QFrame::Sunken);	label1->setFrameShape(QFrame::WinPanel);	label2 = new QLabel;		label2->setMinimumSize(200, 25);	label2->setFrameShadow(QFrame::Sunken);	label2->setFrameShape(QFrame::WinPanel);	bar->addWidget(label1);	bar->addWidget(label2);}void CMainWindow::iniConnect(){	connect(textEdit, SIGNAL(cursorPositionChanged()), 		this, SLOT(doCursorChanged()));	connect(actNew, SIGNAL(triggered()), 		this, SLOT(doNew()));	connect(actOpen, SIGNAL(triggered()), 		this, SLOT(doOpen()));	connect(actClose, SIGNAL(triggered()), 		this, SLOT(doClose()));	connect(actSave, SIGNAL(triggered()), 		this, SLOT(doSave()));	connect(actASave, SIGNAL(triggered()), 		this, SLOT(doASave()));	connect(actQuit, SIGNAL(triggered()),		this, SLOT(doQuit()));	connect(actUndo, SIGNAL(triggered()), 		this, SLOT(doUndo()));	connect(actCut, SIGNAL(triggered()), 		this, SLOT(doCut()));	connect(actCopy, SIGNAL(triggered()), 		this, SLOT(doCopy()));	connect(actPaste, SIGNAL(triggered()), 		this, SLOT(doPast()));	connect(actAll, SIGNAL(triggered()), 		this, SLOT(doAll()));	connect(actFind, SIGNAL(triggered()), 		this, SLOT(doFind()));	connect(textEdit->document(), SIGNAL(contentsChanged()), 		this, SLOT(doModified()));	separatorAct = menu_F->insertSeparator(actQuit);	separatorAct->setVisible(false);	for (int i = 0; i < MaxRecentFiles; ++i) 	{         recentFileActs[i] = new QAction(this);		 menu_F->insertAction(separatorAct, recentFileActs[i]);         recentFileActs[i]->setVisible(false);         connect(recentFileActs[i], SIGNAL(triggered()),                 this, SLOT(openRecentFile()));     }	 	 	actPrint = menu_T->addAction(tr("打印文档"));	connect(actPrint, SIGNAL(triggered()), this, SLOT(doPrint()));}void CMainWindow::doCursorChanged(){	int pageNum = textEdit->document()->pageCount();	const QTextCursor cursor = textEdit->textCursor();	int colNum = cursor.columnNumber();	int rowNum = textEdit->document()->blockCount();		label1->setText(tr("%1 页	%3 列").arg(pageNum).arg(colNum));}void CMainWindow::doFind(){	dockWidget->show();	dockWidget->setFloating(false);}////////////////////////////////////////////////////////////////////单文档实现。void CMainWindow::doNew(){	maybeSave();	isUntitled = true;	curFile = tr("untitled");	setWindowTitle(curFile + "[*]");		textEdit->clear();		textEdit->setVisible(true);	setWindowModified(false);}////////////////////////////////////////////////////////////////////多文档实现。// void CMainWindow::doNew()// {// 	CMainWindow* mainWindow = new CMainWindow;// 	mainWindow->setVisible(true);// }void CMainWindow::maybeSave(){	if(textEdit->document()->isModified())	{		QMessageBox box;		box.setWindowTitle(tr("警告"));				box.setIcon(QMessageBox::Warning);		box.setText(tr("文档没有保存,是否保存?"));		box.setStandardButtons(QMessageBox::Yes 								| QMessageBox::No);		if(box.exec() == QMessageBox::Yes)		{			doSave();		}	}}void CMainWindow::doOpen(){	QString fileName = QFileDialog::getOpenFileName(this);	if (!fileName.isEmpty()) 	{				maybeSave();		if (loadFile(fileName)) 		{						label2->setText(tr("已经读取"));		}	}		textEdit->setVisible(true);	}bool CMainWindow::loadFile(const QString& fileName){	QFile file(fileName);	if (!file.open(QFile::ReadOnly | QFile::Text)) 	{		QMessageBox::warning(this, tr("读取文件"),							tr("无法读取文件 %1:\n%2.")							.arg(fileName)							.arg(file.errorString()));		return false;	}	QTextStream in(&file);	QApplication::setOverrideCursor(Qt::WaitCursor);	textEdit->setText(in.readAll());	QApplication::restoreOverrideCursor();	setCurrentFile(fileName);	return true;}////////////////////////////////////////////////////////////////////单文档实现。void CMainWindow::setCurrentFile(const QString& fileName){	curFile = QFileInfo(fileName).canonicalFilePath();	isUntitled = false;	setWindowTitle(curFile + "[*]");		textEdit->document()->setModified(false);	setWindowModified(false);		QSettings settings("709", "SDI example");	QStringList files = settings.value("recentFiles").toStringList();	files.removeAll(fileName);	files.prepend(fileName);	while (files.size() > MaxRecentFiles)		files.removeLast();	settings.setValue("recentFiles", files);	updateRecentFiles();}////////////////////////////////////////////////////////////////////// 多文档实现。// void CMainWindow::setCurrentFile(const QString& fileName)// {// 	curFile = QFileInfo(fileName).canonicalFilePath();// 	isUntitled = false;// 	setWindowTitle(curFile + "[*]");// 	textEdit->document()->setModified(false);//	setWindowModified(false);// 	// 	QSettings settings("709", "SDI example");// 	QStringList files = settings.value("recentFiles").toStringList();// 	files.removeAll(fileName);// 	files.prepend(fileName);// 	while (files.size() > MaxRecentFiles)// 		files.removeLast();// 	settings.setValue("recentFiles", files);// // 	foreach (QWidget *widget, QApplication::topLevelWidgets()) // 	{// 		CMainWindow *mainWindow = qobject_cast<CMainWindow *>(widget);// 		if (mainWindow)// 			mainWindow->updateRecentFiles();// 	}// }void CMainWindow::updateRecentFiles(){	QSettings settings("709", "SDI example");	QStringList files = settings.value("recentFiles").toStringList();	int numRecentFiles = qMin(files.size(), (int)MaxRecentFiles);	for (int i = 0; i < numRecentFiles; ++i) 	{		QString text = tr("&%1 %2").arg(i + 1).arg(files[i]);		recentFileActs[i]->setText(text);		recentFileActs[i]->setData(files[i]);		recentFileActs[i]->setVisible(true);	}	for (int i = numRecentFiles; i < MaxRecentFiles; ++i)		recentFileActs[i]->setVisible(false);	separatorAct->setVisible(numRecentFiles > 0);}void CMainWindow::doClose(){	maybeSave();	textEdit->setVisible(false);}void CMainWindow::doSave(){	if (isUntitled) 	{         doASave();     } else 	 {         saveFile(curFile);     }}void CMainWindow::doASave(){	QString fileName = 		QFileDialog::getSaveFileName(this, tr("另存为"), curFile);     if (!fileName.isEmpty())	 {		saveFile(fileName);	 	 }}void CMainWindow::doQuit(){	doClose();	qApp->quit();}void CMainWindow::doUndo(){	textEdit->undo();}void CMainWindow::doCut(){	textEdit->cut();}void CMainWindow::doCopy(){	textEdit->copy();}void CMainWindow::doPast(){	textEdit->paste();}void CMainWindow::doAll(){	textEdit->selectAll();}bool CMainWindow::saveFile(const QString& fileName){	QFile file(fileName);	if (!file.open(QFile::WriteOnly | QFile::Text)) 	{		QMessageBox::warning(this, 							tr("保存文件"),							tr("无法保存文件 %1:\n%2.")							.arg(fileName)							.arg(file.errorString()));		return false;	}	QTextStream out(&file);	QApplication::setOverrideCursor(Qt::WaitCursor);	out << textEdit->toPlainText();	QApplication::restoreOverrideCursor();	setCurrentFile(fileName);		label2->setText(tr("已经保存"));		return true;}void CMainWindow::doModified(){	setWindowModified(textEdit->document()->isModified());	label2->setText(tr("正在修改"));}void CMainWindow::openRecentFile(){	QAction *action = qobject_cast<QAction *>(sender());	if (action)		loadFile(action->data().toString());}void CMainWindow::doPrint(){	QTextDocument *document = textEdit->document();	QPrinter printer;	QPrintDialog dlg(&printer, this);	dlg.setWindowTitle(tr("打印文档"));	if (dlg.exec() != QDialog::Accepted)		return;	document->print(&printer);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -