реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Прилипание к краям экрана Qt
nice_vladi
сообщение Nov 28 2017, 03:51
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 7-09-16
Из: Томск
Пользователь №: 93 239



Всем привет. Вопрос простой: как реализовать прилипание к краям экрана основного виджета (QMainWindow) в Qt Creator? Либо каким образом можно сделать прилипание? Может быть, главная форма не имеет такой возможности? Поиски в интернатах и книжках не привели к успеху(((

Qt Creator 4.0.2
Windows 7
Go to the top of the page
 
+Quote Post
arhiv6
сообщение Nov 28 2017, 05:18
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



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

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());
}
}



--------------------
Go to the top of the page
 
+Quote Post
nice_vladi
сообщение Nov 28 2017, 07:53
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 7-09-16
Из: Томск
Пользователь №: 93 239



Цитата(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());
}
}


Спасибо. Хочется делать правильно. Отсюда новый вопрос: как сообщить оконному менеджеру о том, что это окно следует обрабатывать с прилипанием к краям (отдать ему эту работу)? И будет ли это платформозависимым?
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Dec 6 2017, 13:48
Сообщение #4


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Я не виндовс-программист профессиональный, но я у вендового менеджера функции прилипания не помню.

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

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


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
SlavaV
сообщение Dec 16 2017, 13:02
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 13-06-06
Из: г.Улан-Удэ
Пользователь №: 18 024



Привет

Код
    QDockWidget * pdocCtrl = new QDockWidget("Controls", this);
    Control * pctrl = new Control(dev, this);
    pdocCtrl->setWidget(pctrl);
    pmnuPanel->addAction(pdocCtrl->toggleViewAction());
    addDockWidget(Qt::LeftDockWidgetArea, pdocCtrl);
Go to the top of the page
 
+Quote Post
nice_vladi
сообщение Jan 31 2018, 07:04
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 7-09-16
Из: Томск
Пользователь №: 93 239



Всем привет!

Добрались руки до нормальной переделки. За исходник взял код 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());
}
}
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 00:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016