nice_vladi 3 28 ноября, 2017 Опубликовано 28 ноября, 2017 · Жалоба Всем привет. Вопрос простой: как реализовать прилипание к краям экрана основного виджета (QMainWindow) в Qt Creator? Либо каким образом можно сделать прилипание? Может быть, главная форма не имеет такой возможности? Поиски в интернатах и книжках не привели к успеху((( Qt Creator 4.0.2 Windows 7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arhiv6 20 28 ноября, 2017 Опубликовано 28 ноября, 2017 · Жалоба Правильнее отдать эту работу оконному менеджеру. Но если очень хочется, можно вот так попробовать: 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()); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 3 28 ноября, 2017 Опубликовано 28 ноября, 2017 · Жалоба Правильнее отдать эту работу оконному менеджеру. Но если очень хочется, можно вот так попробовать: 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()); } } Спасибо. Хочется делать правильно. Отсюда новый вопрос: как сообщить оконному менеджеру о том, что это окно следует обрабатывать с прилипанием к краям (отдать ему эту работу)? И будет ли это платформозависимым? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 6 декабря, 2017 Опубликовано 6 декабря, 2017 · Жалоба Я не виндовс-программист профессиональный, но я у вендового менеджера функции прилипания не помню. Вообще кажется, что большинство оконных менеджеров этим не владеют. Поэтому если очень нужно то надо делать руками. Что будет, когда одновременно и оконный менеджер решит прилипание организовать и в коде оно будет? Не готов ответить. Сказать что лучше/правильнее, наверно, сможет только автор проекта, оценив все за и против... Всё как всегда ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SlavaV 0 16 декабря, 2017 Опубликовано 16 декабря, 2017 · Жалоба Привет 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 3 31 января, 2018 Опубликовано 31 января, 2018 · Жалоба Всем привет! Добрались руки до нормальной переделки. За исходник взял код 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()); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться