代码拉取完成,页面将自动刷新
#include "mdiarea.h"
#include "mainwindow.h"
#include "iconmanager.h"
#include "mdichild.h"
#include "mdiwindow.h"
#include "taskbar.h"
#include "uiconfig.h"
#include <QMdiSubWindow>
#include <QAction>
#include <QActionGroup>
#include <QDebug>
MdiArea::MdiArea(QWidget *parent) :
QMdiArea(parent)
{
}
MdiWindow *MdiArea::addSubWindow(MdiChild *mdiChild)
{
MdiWindow* mdiWin = new MdiWindow(mdiChild, this);
QMdiArea::addSubWindow(mdiWin);
mdiWin->show();
if (taskBar)
{
QAction* action = taskBar->addTask(mdiWin->windowIcon(), mdiWin->windowTitle());
action->setCheckable(true);
action->setChecked(true);
actionToWinMap[action] = mdiWin;
winToActionMap[mdiWin] = action;
connect(action, &QAction::triggered, this, &MdiArea::taskActivated);
connect(mdiWin, &QMdiSubWindow::aboutToActivate, this, &MdiArea::windowActivated);
}
if (!mdiChild->handleInitialFocus())
mdiChild->setFocus();
if (taskBar)
{
if (taskBar->getTasks().size() == 1 && CFG_UI.General.OpenMaximized.get())
mdiWin->setWindowState(mdiWin->windowState()|Qt::WindowMaximized);
}
emit windowListChanged();
return mdiWin;
}
MdiWindow *MdiArea::getActiveWindow()
{
return dynamic_cast<MdiWindow*>(activeSubWindow());
}
void MdiArea::setTaskBar(TaskBar* value)
{
taskBar = value;
}
TaskBar* MdiArea::getTaskBar() const
{
return taskBar;
}
QAction* MdiArea::getTaskByWindow(MdiWindow* window)
{
if (winToActionMap.contains(window))
return winToActionMap[window];
return nullptr;
}
QList<MdiWindow*> MdiArea::getWindows() const
{
QList<MdiWindow*> windowList;
for (QAction* action : taskBar->getTasks())
windowList << actionToWinMap[action];
return windowList;
}
QList<MdiChild*> MdiArea::getMdiChilds() const
{
QList<MdiChild*> childs;
for (MdiWindow* win : getWindows())
childs << win->getMdiChild();
return childs;
}
QList<MdiWindow*> MdiArea::getWindowsToTile() const
{
QList<MdiWindow*> list;
for (MdiWindow *window : getWindows())
{
if (window->isMinimized())
continue;
list << window;
}
return list;
}
void MdiArea::taskActivated()
{
QAction* action = dynamic_cast<QAction*>(sender());
if (!action)
{
qWarning() << "MdiArea::taskActivated() slot called by sender that is not QAction.";
return;
}
setActiveSubWindow(actionToWinMap[action]);
}
void MdiArea::windowDestroyed(MdiWindow* window)
{
if (!taskBar)
return;
QAction* action = winToActionMap[window];
QAction* taskToSelect = nullptr;
if (!MAINWINDOW->isClosingApp())
{
taskToSelect = taskBar->getNextTask(action);
if (!taskToSelect)
taskToSelect = taskBar->getPrevTask(action);
}
winToActionMap.remove(window);
actionToWinMap.remove(action);
taskBar->removeTask(action);
delete action;
emit windowListChanged();
if (taskToSelect)
taskBar->setActiveTask(taskToSelect);
}
void MdiArea::windowActivated()
{
if (!taskBar)
return;
MdiWindow* subWin = dynamic_cast<MdiWindow*>(sender());
if (!subWin)
{
qWarning() << "MdiArea::windowActivated() slot called by sender that is not QMdiSubWindow.";
return;
}
QAction* action = winToActionMap[subWin];
action->setChecked(true);
}
void MdiArea::tileHorizontally()
{
if (taskBar->isEmpty())
return;
bool gotFocus = false;
QPoint position(0, 0);
QList<MdiWindow*> windowsToTile = getWindowsToTile();
int winCnt = windowsToTile.count();
for (MdiWindow *window : windowsToTile)
{
if (window->isMaximized())
window->showNormal();
QRect rect(0, 0, width() / winCnt, height());
window->setGeometry(rect);
window->move(position);
position.setX(position.x() + window->width());
if (window->hasFocus())
gotFocus = true;
}
if (!gotFocus && windowsToTile.size() > 0)
windowsToTile.first()->setFocus();
}
void MdiArea::tileVertically()
{
if (taskBar->isEmpty())
return;
bool gotFocus = false;
QPoint position(0, 0);
QList<MdiWindow*> windowsToTile = getWindowsToTile();
int winCnt = windowsToTile.count();
for (MdiWindow *window : windowsToTile)
{
if (window->isMaximized())
window->showNormal();
QRect rect(0, 0, width(), height() / winCnt);
window->setGeometry(rect);
window->move(position);
position.setY(position.y() + window->height());
if (window->hasFocus())
gotFocus = true;
}
if (!gotFocus && windowsToTile.size() > 0)
windowsToTile.first()->setFocus();
}
void MdiArea::closeAllButActive()
{
QList<QMdiSubWindow*> allButActive = subWindowList();
allButActive.removeOne(activeSubWindow());
for (QMdiSubWindow *window : allButActive)
window->close();
}
MdiWindow* MdiArea::getWindowByChild(MdiChild *child)
{
if (!child)
return nullptr;
for (QMdiSubWindow *window : subWindowList())
if (window->widget() == child)
return dynamic_cast<MdiWindow*>(window);
return nullptr;
}
MdiWindow* MdiArea::getCurrentWindow()
{
QMdiSubWindow* subWin = activeSubWindow();
return dynamic_cast<MdiWindow*>(subWin);
}
bool MdiArea::isActiveSubWindow(MdiWindow *window)
{
if (!window)
return false;
QMdiSubWindow* subWin = currentSubWindow();
if (!subWin)
return false;
return window == subWin;
}
bool MdiArea::isActiveSubWindow(MdiChild *child)
{
if (!child)
return false;
QMdiSubWindow* subWin = currentSubWindow();
if (!subWin)
return false;
return child == subWin->widget();
}
QStringList MdiArea::getWindowTitles()
{
QStringList titles;
for (QMdiSubWindow *subWin : subWindowList())
titles << subWin->windowTitle();
return titles;
}
MdiWindow *MdiArea::getWindowByTitle(const QString &title)
{
for (QMdiSubWindow *subWin : subWindowList())
{
QString t = subWin->windowTitle();
if (subWin->windowTitle() == title)
{
return dynamic_cast<MdiWindow*>(subWin);
}
}
return nullptr;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。