Перейти к содержанию
    

Прилипание к краям экрана Qt

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

 

Qt Creator 4.0.2

Windows 7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

mainwindow.h

#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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

mainwindow.h

#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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Что будет, когда одновременно и оконный менеджер решит прилипание организовать и в коде оно будет? Не готов ответить.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Привет

 

    QDockWidget * pdocCtrl = new QDockWidget("Controls", this);
    Control * pctrl = new Control(dev, this);
    pdocCtrl->setWidget(pctrl);
    pmnuPanel->addAction(pdocCtrl->toggleViewAction());
    addDockWidget(Qt::LeftDockWidgetArea, pdocCtrl);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет!

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...