Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прилипание к краям экрана Qt
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
nice_vladi
Всем привет. Вопрос простой: как реализовать прилипание к краям экрана основного виджета (QMainWindow) в Qt Creator? Либо каким образом можно сделать прилипание? Может быть, главная форма не имеет такой возможности? Поиски в интернатах и книжках не привели к успеху(((

Qt Creator 4.0.2
Windows 7
arhiv6
Правильнее отдать эту работу оконному менеджеру. Но если очень хочется, можно вот так попробовать:

mainwindow.h
CODE
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui
{
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

protected:
void moveEvent(QMoveEvent *event);

private:
Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp
CODE
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDesktopWidget>
#include <QDebug>
#include <QtMath>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::moveEvent(QMoveEvent *event)
{
Q_UNUSED(event);

int windowTopBorder = pos().y();
int windowBottomBorder = windowTopBorder + size().height();
int windowLeftBorder = pos().x();
int windowRightBorder = windowLeftBorder + size().width();

qDebug() << windowLeftBorder << windowRightBorder << windowTopBorder << windowBottomBorder;

int screenTopBorder = 0;
int screenBottomBorder = QApplication::desktop()->height();
int screenLeftBorder = 0;
int screenRightBorder = QApplication::desktop()->width();

qDebug() << screenLeftBorder << screenRightBorder << screenTopBorder << screenBottomBorder;

const int magnetDistance = 150;

if (abs(windowLeftBorder - screenLeftBorder) < magnetDistance)
{
move(0, pos().y());
}

if (abs(windowRightBorder - screenRightBorder) < magnetDistance)
{
move(screenRightBorder - size().width(), pos().y());
}

if (abs(windowTopBorder - screenTopBorder) < magnetDistance)
{
move(pos().x(), 0);
}

if (abs(windowBottomBorder - screenBottomBorder) < magnetDistance)
{
move(pos().x(), screenBottomBorder - size().height());
}
}

nice_vladi
Цитата(arhiv6 @ Nov 28 2017, 05:18) *
Правильнее отдать эту работу оконному менеджеру. Но если очень хочется, можно вот так попробовать:

mainwindow.h
CODE
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui
{
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

protected:
void moveEvent(QMoveEvent *event);

private:
Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp
CODE
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDesktopWidget>
#include <QDebug>
#include <QtMath>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::moveEvent(QMoveEvent *event)
{
Q_UNUSED(event);

int windowTopBorder = pos().y();
int windowBottomBorder = windowTopBorder + size().height();
int windowLeftBorder = pos().x();
int windowRightBorder = windowLeftBorder + size().width();

qDebug() << windowLeftBorder << windowRightBorder << windowTopBorder << windowBottomBorder;

int screenTopBorder = 0;
int screenBottomBorder = QApplication::desktop()->height();
int screenLeftBorder = 0;
int screenRightBorder = QApplication::desktop()->width();

qDebug() << screenLeftBorder << screenRightBorder << screenTopBorder << screenBottomBorder;

const int magnetDistance = 150;

if (abs(windowLeftBorder - screenLeftBorder) < magnetDistance)
{
move(0, pos().y());
}

if (abs(windowRightBorder - screenRightBorder) < magnetDistance)
{
move(screenRightBorder - size().width(), pos().y());
}

if (abs(windowTopBorder - screenTopBorder) < magnetDistance)
{
move(pos().x(), 0);
}

if (abs(windowBottomBorder - screenBottomBorder) < magnetDistance)
{
move(pos().x(), screenBottomBorder - size().height());
}
}


Спасибо. Хочется делать правильно. Отсюда новый вопрос: как сообщить оконному менеджеру о том, что это окно следует обрабатывать с прилипанием к краям (отдать ему эту работу)? И будет ли это платформозависимым?
sigmaN
Я не виндовс-программист профессиональный, но я у вендового менеджера функции прилипания не помню.

Вообще кажется, что большинство оконных менеджеров этим не владеют. Поэтому если очень нужно то надо делать руками.
Что будет, когда одновременно и оконный менеджер решит прилипание организовать и в коде оно будет? Не готов ответить.

Сказать что лучше/правильнее, наверно, сможет только автор проекта, оценив все за и против... Всё как всегда )
SlavaV
Привет

Код
    QDockWidget * pdocCtrl = new QDockWidget("Controls", this);
    Control * pctrl = new Control(dev, this);
    pdocCtrl->setWidget(pctrl);
    pmnuPanel->addAction(pdocCtrl->toggleViewAction());
    addDockWidget(Qt::LeftDockWidgetArea, pdocCtrl);
nice_vladi
Всем привет!

Добрались руки до нормальной переделки. За исходник взял код arhiv6 и малость допилил. Корректно работает на нескольких мониторах (расширенный рабочий стол). И корректно отрабатывает доступные области (липнет к краям панели задач, а не к краю экрана под ней).

Пробовал только под виндой. Если руки дойдут - попробую под линуксом - отпишусь (хочется проверить, не будет ли конфликтов с wm).

CODE

void MainWindow::moveEvent(QMoveEvent *event)
{
Q_UNUSED(event);

const int magnetDistance = 100;

int screenNum = QApplication::desktop()->screenNumber(this);

int windowTopBorder = pos().y();
int windowBottomBorder = windowTopBorder + size().height();
int windowLeftBorder = pos().x();
int windowRightBorder = windowLeftBorder + size().width();

qDebug() << "win" << windowLeftBorder << windowRightBorder << windowTopBorder << windowBottomBorder;

int screenTopBorder = QApplication::desktop()->availableGeometry(screenNum).top();
int screenBottomBorder = QApplication::desktop()->availableGeometry(screenNum).bottom();
int screenLeftBorder = QApplication::desktop()->availableGeometry(screenNum).left();
int screenRightBorder = QApplication::desktop()->availableGeometry(screenNum).right();

qDebug() << "screen" << screenLeftBorder << screenRightBorder << screenTopBorder << screenBottomBorder;

if (abs(windowLeftBorder - screenLeftBorder) < magnetDistance) {
move(screenLeftBorder, windowTopBorder);
}

if (abs(windowRightBorder - screenRightBorder) < magnetDistance) {
move(screenRightBorder - size().width(), windowTopBorder);
}

if (abs(windowTopBorder - screenTopBorder) < magnetDistance) {
move(windowLeftBorder, screenTopBorder);
}

if (abs(windowBottomBorder - screenBottomBorder) < magnetDistance) {
move(windowLeftBorder, screenBottomBorder - size().height());
}
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.