主要用到的方法:
raise();
lower();
stackUnder();
DragWin* MediaServer::curWidget;
//curWidget 记录当前选中的小窗口
// 置顶
void MediaServer::on_winOnTopBtn_clicked()
{
if(curWidget == nullptr) return;
qDebug() << "置顶 curWidget 的层级 ====" << curWidget->winZ;
int minpr;
int pr = curWidget->winZ;
int tmp = pr;
int retid = curWidget->getId();
QList<DragWin*> mywinlist = ui->widget_7->findChildren<DragWin*>();
for (int i = 0; i < mywinlist.size(); i++) {
if (mywinlist[i]->winId == retid) { continue; }
DragWin* subwin = mywinlist[i];
minpr = subwin->winZ;
if (minpr > tmp) { //获取取最小优先级
subwin->winZ = tmp;
tmp = minpr;
curWidget->winZ = tmp;
}
}
curWidget->raise();
qDebug() << "置顶 id; ====" << retid;
}
// 置底
void MediaServer::on_winOnBotBtn_clicked()
{
if(curWidget == nullptr) return;
qDebug() << "置底 curWidget->winZ; ====" << curWidget->winZ;
int minpr;
int pr = curWidget->winZ;
int tmp = pr;
int retid = curWidget->getId();
QList<DragWin*> mywinlist = ui->widget_7->findChildren<DragWin*>();
for (int i = 0; i < mywinlist.size(); i++) {
DragWin* subwin = mywinlist[mywinlist.size() - 1 - i];
minpr = subwin->winZ;
if (minpr < tmp && minpr != 0) { //一次从大向小修改
subwin->winZ = tmp;
tmp = minpr;
curWidget->winZ = tmp;
}
}
curWidget->lower();
}
// 上移
void MediaServer::on_winMvUpBtn_clicked()
{
if(curWidget == nullptr) return;
qDebug() << "上移 ====" << curWidget->winZ;
// 寻找zIndex大于选中的,并且最接近的那个
DragWin* nextDiv = nullptr;
int nextIndex = 999999;
int fIndex = curWidget->winZ;
int retid = curWidget->getId();
QList<DragWin*> divs = ui->widget_7->findChildren<DragWin*>();
//得到被修改的div元素
for (int i = 0; i < divs.size(); i++) {
int index = divs[i]->winZ;
if (index > fIndex && index < nextIndex) {
nextDiv = divs[i];
nextIndex = index;
}
}
if (nextDiv == nullptr) { //已在最上层
qDebug() << "已在最上层 ====" << curWidget->winZ;
return;
}
//交换zIndex
if (nextDiv) {
curWidget->winZ = nextIndex;
nextDiv->winZ = fIndex;
nextDiv->stackUnder(curWidget);
}
}
// 下移
void MediaServer::on_winMvDnBtn_clicked()
{
if(curWidget == nullptr) return;
qDebug() << "下移 ====" << curWidget->winZ;
// 寻找zIndex小于选中的,并且最接近的那个
DragWin* nextDiv = nullptr;
int nextIndex = 0;
int fIndex = curWidget->winZ; //被选中窗口的zindex
int retid = curWidget->getId();
QList<DragWin*> divs = ui->widget_7->findChildren<DragWin*>();
//得到被修改的div元素
for (int i = 0; i < divs.size(); i++) {
int index = divs[i]->winZ;
if (index > fIndex && index < nextIndex) {
nextDiv = divs[i];
nextIndex = index;
}
}
for (int i = 0; i < divs.size(); i++) {
int index = divs[i]->winZ;
if (index < fIndex && index > nextIndex) {
nextDiv = divs[i];
nextIndex = index;
}
}
//交换zIndex
if (nextDiv == nullptr) {
return;
} //已在最下层防止报错
if (nextDiv) {
curWidget->winZ = nextIndex;
nextDiv->winZ = fIndex;
curWidget->stackUnder(nextDiv);
}
}
选中窗口 点击 置顶、置顶、上移、下移 操作来控制小窗口的层级显示: