Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [qt] вывод на несколько мониторов


Автор: gordmiand 22.7.2010, 23:13
Есть 2 монитора с независимыми друг от друга рабочими столами (без использования опции TwinView (единый раб. стол)). При загрузке приложения необходимо загрузить одну его форму во весь экран1 (верхний дисплей), а другую форму – на весь экран2 (нижний дисплей)…как это оптимальнее и изящнее всего сделать?

Я в свое время пробовал так 
Код

Form1->setGeometry(0,0,100,100);
Form1->showFullScreen(); 
...
Form2->setGeometry(0,1025,100,100);
Form2->showFullScreen(); 

Но не уверен, что это сработает (на данный момент нет возможности это проверить)…

Но это с привязкой к разрешениями мониторов (1280x1024) – типа я прошу вывести мне форму Form1 например размером 100х100 в координаты (0,0) и раскрываю ее на весь экран, а затем – форму Form2 размером 100х100 в координаты (0, например 1025) – типа ниже формы Form1 в надежде, что у обоих мониторов единый “пиксельный размер…а  вот если это не так, то как такую задачку решить без привязки к текущим разрешениям мониторов?

Автор: pilotnet 23.7.2010, 12:41
Глянь QDesktopWidget

Автор: gordmiand 23.7.2010, 13:52
pilotnet: дайте пож-та примерчик, а то я не совем понял по-английски что именно из этого класса и как надо использовать... 
задача - вывести разные формы одного приложения на независимые друг от друга рабочие столы двух мониторов (каждую форму во весь экран (showFullScreen))...

Автор: pilotnet 26.7.2010, 08:18
QRect screenres = QApplication::desktop()->screenGeometry(screenNumber);
widget->move(QPoint(screenres.x(), screenres.y()));

Автор: gordmiand 29.7.2010, 22:10
pilotnet: 
то есть я могу написать:
Код

QRect screenres = QApplication::desktop()->screenGeometry(1);
Form1->move(QPoint(screenres.x(), screenres.y()));
Form1->showFullScreen();

QRect screen2res = QApplication::desktop()->screenGeometry(2);
Form2->move(QPoint(screen2res.x(), screen2res.y()));
Form2->showFullScreen();

и тогда при загрузке приложения форма Form1 будет во весь экран1, а форма2 - во весь экран2 или нет? если нет, то тогда как это сделать правильно (просто в данный момент нет возможности проверить вышеприведенный мой код на 2 мониторах)?

Автор: gordmiand 2.8.2010, 18:33
пробовал так: (операционка Linux OpenSuse 10.3)
Код

QRect screenres = QApplication::desktop()->screenGeometry(0);
Form1->move(QPoint(screenres.x(), screenres.y()));
Form1->showFullScreen();

QRect screen2res = QApplication::desktop()->screenGeometry(1);
Form2->move(QPoint(screen2res.x(), screen2res.y()));
Form2->showFullScreen();

это конечно не работает - одна форма выводится поверх другой на одном и том же экране, на котором было запущено приложение, так как у меня 2 независимых друг от друга рабочих стола - т.е. какое-либо окошко нельзя перетащить с одного экрана на другой, но мышка переходит (так и должно быть) - так как же при такой настройке рабочих столов мониторов сделать вывод каждой формы (Form1 и Form2) на свой экран (№0 и №1 соответственно (номера я менял на 1 и 2 - не помогает))? ... использование размеров (как в примере выше) каждой формы не помогает, так как у каждой из них свое разрешение (у каждой 1280*1024 - так и должно быть)... подскажите пож-та...очень надо....

Автор: SABROG 2.8.2010, 19:35
А QDesktopWidget::screenCount() вообще возвращает число больше одного?

Автор: gordmiand 2.8.2010, 21:53
SABROG: конечно screenCount возвращает число >1...почему нет? у меня эта функция возвращает "2" (собственно 2 монитора у меня и есть)...только к чему тут эта функция?

Автор: SABROG 2.8.2010, 22:19
При создании виджетов попробуй для одного выставить родителем один экран, а для другого другой:

Код

MyWidget w1(QDesktopWidget::screen(0));
MyWidget2 22(QDesktopWidget::screen(1));
w1.show();
w2.show();
return app.exec();

Автор: gordmiand 2.8.2010, 22:48
допустим такой примерчик:
Код

class Form2 : public QWidget {
    Q_OBJECT
public:
    Form2(QWidget *parent = 0);
    ~Form2();

protected:
    void changeEvent(QEvent *e);

private:
    Ui::Form2 *ui;
};
/////////////////////////////////

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

    Form2 *exz2;

protected:
    void changeEvent(QEvent *e);

private:
    Ui::MainWindow *ui;
};
/////////////////////////////////


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDesktopWidget>

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

    exz2 = new Form2(QDesktopWidget::screen(0));

}

ошибка:
error: cannot call member function 'QWidget* QDesktopWidget::screen(int)' without object 

Автор: SABROG 3.8.2010, 08:06
Извиняюсь, я не обратил внимание, что метод не статический. Тогда так:

Код

exz2 = new Form2(QApplication::desktop()->screen(0));

Автор: gordmiand 3.8.2010, 10:04
ошибку исправил так:
Код

    QDesktopWidget desk;
    exz2 = new Form2(desk.screen( 1 )  );
    exz2->show();

но эффекта все равно нет...обе формы выводятся на один и тот же экран вне зависимости от указанного мной в констукторе номера экрана для Form2...так почему же не воспринимается задание номера экрана для формы? вроде QDesktopWidget::screen возвращает QWidget *, что как раз и надо для параметра (задает родителя для формы) конструктора класса Form2...ничего не понимаю....вроде так все логично - в качестве родителя форме задаешь нужный тебе экран...может надо делать какие-то дополнительные магипуляции с классом Form2?

затем пробовал еще так:
Код

exz2 = new Form2(QApplication::desktop()->screen( 0 )  ); // или менял Nскрина на 1,2

без именений...
на всякий случай кинул проект проги...

Автор: SABROG 3.8.2010, 11:06
Цитата(gordmiand @  3.8.2010,  10:04 Найти цитируемый пост)
без именений...

Попробуй получить ширину в разрешении монитора через QDesktopWidget::availableGeometry(), а потом вызвать метод move() у своего виджета, чтобы передвинуть виджет дальше чем позволяет ширина рабочего стола, возможно тогда виджет появится на другом монике.

Автор: wectula 9.12.2022, 23:58
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)