WPS活动子窗口
好我们继续
信号同上(默认)
信号同上(默认)
具体代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "childwnd.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void initMainWindow();
void docNew();
private slots:
void on_newAction_triggered();
void refreshMenus();
void addSubWndListMenu();
void on_closeAction_triggered();
void on_closeAllAction_triggered();
void on_titleAction_triggered();
void on_cascadeAction_triggered();
void on_nextAction_triggered();
void on_previousAction_triggered();
protected:
void closeEvent(QCloseEvent *event);
private:
void formatEnabled();
ChildWnd* activateChildWnd();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "childwnd.h"
#include <QFontDatabase>
#include <QMdiSubWindow>
#include <QCloseEvent>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
initMainWindow();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initMainWindow()
{
//初始化字号列表项
QFontDatabase fontdb;
foreach(int fontsize, fontdb.standardSizes())
{
ui->sizeComboBox->addItem(QString::number(fontsize));
}
QFont defFont; //当前应用程序默认的字体
QString sFontSize;
int defFontSize; //当前应用程序默认字体的字号
int defFontindex; //当前字号在组合框中的索引号
defFont = QApplication::font();
defFontSize = defFont.pointSize();
sFontSize = QString::number(defFontSize);
defFontindex = ui->sizeComboBox->findText(sFontSize);
ui->sizeComboBox->setCurrentIndex(defFontindex);
//设置多文档区域滚动条
ui->mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
ui->mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
refreshMenus();
connect(ui->mdiArea, &QMdiArea::subWindowActivated, this, &MainWindow::refreshMenus);
addSubWndListMenu();
connect(ui->menu_W, &QMenu::aboutToShow, this, &MainWindow::addSubWndListMenu);
}
void MainWindow::docNew()
{
ChildWnd* childwnd = new ChildWnd;
ui->mdiArea->addSubWindow(childwnd);
connect(childwnd, SIGNAL(copyAvailable(bool)), ui->cutAction, SLOT(setEnabled(bool)));
connect(childwnd, SIGNAL(copyAvailable(bool)), ui->copyAction, SLOT(setEnabled(bool)));
childwnd->newDoc();
childwnd->show();
formatEnabled();
}
void MainWindow::on_newAction_triggered()
{
docNew();
}
void MainWindow::refreshMenus()
{
bool hasChild;
hasChild = (activateChildWnd() != 0);
ui->saveAction->setEnabled(hasChild);
ui->saveAsAction->setEnabled(hasChild);
ui->printAction->setEnabled(hasChild);
ui->printPreviewAction->setEnabled(hasChild);
ui->pasteAction->setEnabled(hasChild);
ui->closeAction->setEnabled(hasChild);
ui->closeAllAction->setEnabled(hasChild);
ui->titleAction->setEnabled(hasChild);
ui->cascadeAction->setEnabled(hasChild);
ui->nextAction->setEnabled(hasChild);
ui->previousAction->setEnabled(hasChild);
//文档打开且有内容选中
bool hasSelect = ( activateChildWnd() && activateChildWnd()->textCursor().hasSelection() );
ui->cutAction->setEnabled(hasSelect);
ui->copyAction->setEnabled(hasSelect);
ui->boldAction->setEnabled(hasSelect);
ui->italicAction->setEnabled(hasSelect);
ui->underlineAction->setEnabled(hasSelect);
ui->leftAlignAction->setEnabled(hasSelect);
ui->centerAction->setEnabled(hasSelect);
ui->rightlignAction->setEnabled(hasSelect);
ui->justifyAction->setEnabled(hasSelect);
ui->colorAction->setEnabled(hasSelect);
}
void MainWindow::addSubWndListMenu()
{
ui->menu_W->clear();
ui->menu_W->addAction(ui->closeAction);
ui->menu_W->addAction(ui->closeAllAction);
ui->menu_W->addSeparator();
ui->menu_W->addAction(ui->titleAction);
ui->menu_W->addAction(ui->cascadeAction);
ui->menu_W->addSeparator();
ui->menu_W->addAction(ui->nextAction);
ui->menu_W->addAction(ui->previousAction);
QList<QMdiSubWindow*> wnds = ui->mdiArea->subWindowList();
if (!wnds.isEmpty()) ui->menu_W->addSeparator();
for (int i = 0; i < wnds.size(); ++i)
{
ChildWnd *childWnd = qobject_cast<ChildWnd*>(wnds.at(i)->widget());
QString menuitem_text;
menuitem_text = QString("%1 %2").arg(i+1).arg(childWnd->getCurDocName());
QAction *menuitem_act = ui->menu_W->addAction(menuitem_text);
menuitem_act->setCheckable(true);
menuitem_act->setChecked(childWnd == activateChildWnd());
}
formatEnabled();
}
void MainWindow::formatEnabled()
{
ui->boldAction->setEnabled(true);
ui->italicAction->setEnabled(true);
ui->underlineAction->setEnabled(true);
ui->leftAlignAction->setEnabled(true);
ui->centerAction->setEnabled(true);
ui->rightlignAction->setEnabled(true);
ui->justifyAction->setEnabled(true);
ui->colorAction->setEnabled(true);
}
ChildWnd *MainWindow::activateChildWnd()
{
QMdiSubWindow* actWnd = ui->mdiArea->activeSubWindow();
if (actWnd)
return qobject_cast<ChildWnd*>(actWnd->widget());
else
return 0;
}
void MainWindow::on_closeAction_triggered()
{
ui->mdiArea->closeActiveSubWindow();
}
void MainWindow::on_closeAllAction_triggered()
{
ui->mdiArea->closeAllSubWindows();
}
void MainWindow::on_titleAction_triggered()
{
ui->mdiArea->tileSubWindows();
}
void MainWindow::on_cascadeAction_triggered()
{
ui->mdiArea->cascadeSubWindows();
}
void MainWindow::on_nextAction_triggered()
{
ui->mdiArea->activateNextSubWindow();
}
void MainWindow::on_previousAction_triggered()
{
ui->mdiArea->activatePreviousSubWindow();
}
void MainWindow::closeEvent(QCloseEvent *event)
{
ui->mdiArea->closeAllSubWindows();
if (ui->mdiArea->currentSubWindow())
event->ignore(); //忽略此事件
else
event->accept(); //接收此事件
}
#ifndef CHILDWND_H
#define CHILDWND_H
#include <QTextEdit>
class ChildWnd : public QTextEdit
{
Q_OBJECT
public:
ChildWnd();
QString m_CurDocPath; //当前文档路径
void newDoc(); //新建文档
QString getCurDocName(); //文档路径中提取文档名
public slots:
void docBeModified(); //文档修改时, 窗口的标题栏加 *
private:
bool m_bSaved; //文档是否保存
};
#endif // CHILDWND_H
#include "childwnd.h"
#include <QFileInfo>
ChildWnd::ChildWnd()
{
//子窗口关闭时销毁该类的示例对象
setAttribute(Qt::WA_DeleteOnClose);
m_bSaved = false;
}
void ChildWnd::newDoc()
{
static int wndSepNum = 1;
m_CurDocPath = QString("WPS 文档%1").arg(wndSepNum++);
//设置窗体标题, 文档改动后名称后加 "*" 号标识
setWindowTitle(m_CurDocPath + "[*]" + " - MyWPs");
connect(document(), SIGNAL(contentsChanged()), this, SLOT(docBeModified()));
}
QString ChildWnd::getCurDocName()
{
return QFileInfo(m_CurDocPath).fileName();
}
void ChildWnd::docBeModified()
{
setWindowModified(document()->isModified());
}
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
测验ok
结语:
时间: 2020-08-09