Russian Qt Forum

Qt => Qt Quick => Тема начата: Victor007 от Июнь 05, 2013, 17:03



Название: Развернуть окно
Отправлено: Victor007 от Июнь 05, 2013, 17:03
Здравствуйте!
Возник вопрос: как развернуть окно на весь экран? То есть так, чтобы при запуске приложения Widget (или MainWindow) сразу автоматически занимало весь экран, закрывая собой и панель к кнопкой пуск, часами и т.д. и не было видно "шапки" самого виджета? Сама программа очень простая, рисует прямоугольник на белом фоне этого окна.
Спасибо!


Название: Re: Развернуть окно
Отправлено: Bepec от Июнь 05, 2013, 17:21
вирусописатель? :)


Название: Re: Развернуть окно
Отправлено: Kurles от Июнь 05, 2013, 18:34
Здравствуйте!
Возник вопрос: как развернуть окно на весь экран? То есть так, чтобы при запуске приложения Widget (или MainWindow) сразу автоматически занимало весь экран, закрывая собой и панель к кнопкой пуск, часами и т.д. и не было видно "шапки" самого виджета? Сама программа очень простая, рисует прямоугольник на белом фоне этого окна.
Спасибо!
Код
C++ (Qt)
void QWidget::showFullScreen () [slot]


Название: Re: Развернуть окно
Отправлено: Kurles от Июнь 05, 2013, 18:34
вирусописатель? :)
Вирус на Qt? Оригинально :)


Название: Re: Развернуть окно
Отправлено: Bepec от Июнь 05, 2013, 19:44
Вполне нормальный вирус написать можно :D


Название: Re: Развернуть окно
Отправлено: lighting от Июнь 06, 2013, 12:09
и какое отношение вопрос имеет к Qt Quick?


Название: Re: Развернуть окно
Отправлено: Victor007 от Июнь 06, 2013, 16:56
Всем большое спасибо!
To lighting: прошу прощения, вообще стараюсь следить , но тут, видимо, просмотрел. Можно наверное перенести тему?

Мой код main.cpp такой:

#include "mainfr.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainFr w;
    w.show();
   
    return a.exec();
}

Попробовал вставить предложенные варианты, но все время получаю ошибки. Что не так делаю?


Название: Re: Развернуть окно
Отправлено: Victor007 от Июнь 06, 2013, 17:08
Ага! Вот так получилось:

w.showFullScreen();

Да, не сразу сообразишь, как из такого окна выйти. Пока пользуюсь Alt+F4
Забыл еще написать, чтобы всех разуверить: программа нужна для управления экспериментальной установкой, так что вирусы здесь не причем)

PS: Сразу спрошу, раз уж я все равно влез не в ту тему. Мне необходимо этот прямоугольник на белом фоне перерисовывать раз в секунду. Видимо, мне нужна функция задержки и стирания всего, что было нарисовано. Может, подскажете, как это реализовать?
Еще раз большое всем спасибо!


Название: Re: Развернуть окно
Отправлено: Bepec от Июнь 06, 2013, 18:15
Мб проще не мучиться и сразу назвать цель, а не конкретную проблему?

PS на мой взгляд вы пишите ПО на комп, которое будет аналогом ОС. Ну т.е. на весь экран, графики, набор действий и больше ничего.

PPS а под какую платформу?



Название: Re: Развернуть окно
Отправлено: Victor007 от Июнь 07, 2013, 16:53
У меня достаточно большая программа, состоит из нескольких "блоков", то есть, сначала выводится одно окно, потом другое, потом идет обработка данных и т.д. Все это описывать нет смысла. Программа была написана под builder, но недавно главную часть, с которой были проблемы переписали (не я) под qt. Получилось очень красиво и работает безукоризненно. На выходе, мне теперь проще освоить qt и переписать недостающие блоки исходной программы. Опыта пока мало, но он очень полезен. Вроде все объяснил.
Поэтому я и спрашиваю только некоторые технические аспекты. Еще раз спасибо за такую оперативную помощь.
Так как мне сделать перерисовку экрана? По идее, это должно быть достаточно тривиально. Мне дали вот такой совет:
 "Если нужна перерисовка, используйте таймер. По таймеру перемещайте объект (функция translate)", но, честно говоря, я его не очень понял.
Работаю в win8, соответственно, 64-бита.


Название: Re: Развернуть окно
Отправлено: Kurles от Июнь 10, 2013, 11:51
Поэтому я и спрашиваю только некоторые технические аспекты. Еще раз спасибо за такую оперативную помощь.
Так как мне сделать перерисовку экрана? По идее, это должно быть достаточно тривиально. Мне дали вот такой совет:
 "Если нужна перерисовка, используйте таймер. По таймеру перемещайте объект (функция translate)", но, честно говоря, я его не очень понял.
Работаю в win8, соответственно, 64-бита.
Всё зависит от того, как ты рисуешь на экране. А так пока тока один совет вырисовывается - вызывать слот update() у виджета через соединенный сигнал таймера timeout(), настроенный на секунду.


Название: Re: Развернуть окно
Отправлено: Victor007 от Июнь 10, 2013, 16:58
Спасибо, идея понятна! Я пока еще очень с трудом ориентируюсь в сигналах и слотах. Нельзя ли написать какой-то минимальный код?


Название: Re: Развернуть окно
Отправлено: Kurles от Июнь 11, 2013, 10:33
Спасибо, идея понятна! Я пока еще очень с трудом ориентируюсь в сигналах и слотах. Нельзя ли написать какой-то минимальный код?
Код
C++ (Qt)
   QTimer *timer = new QTimer(this);
   //...
 
   connect(timer, SIGNAL(timeout()), this, SLOT(update()));
   timer->start(1000);


Название: Re: Развернуть окно
Отправлено: Victor007 от Июнь 11, 2013, 16:35
Спасибо! Правда, так сразу все равно ничего не работает. Во-первых, программе  в этой строке
Код:
QTimer *timer = new QTimer(this);
не нравится this, я его убрал.
Во-вторых, я решил сначала немного упростить задачу: просто сделать задержку при рисовании каждого следующего прямоугольника. Попробовал вот такой вариант:
Код:
void MainFr::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::darkGreen);
    painter.setBrush(QBrush(Qt::darkGreen, Qt::SolidPattern)); // Чем красим
    painter.drawRect(2, 2, Rect_size-2, Rect_size);
    timer->start(1000);
    painter.drawRect(455-Rect_size-2, 2, Rect_size, Rect_size);
    painter.drawRect(910-Rect_size-2, 2, Rect_size, Rect_size);
    painter.drawRect(1366-Rect_size-2, 2, Rect_size, Rect_size);
}

Однако прямоугольники рисуются без какой-либо задержки. В чем здесь может быть дело?


Название: Re: Развернуть окно
Отправлено: mutineer от Июнь 11, 2013, 17:28
А где должна быть задержка? timer->start() не задерживает выполнение в точке своего вызова


Название: Re: Развернуть окно
Отправлено: Victor007 от Июнь 11, 2013, 18:20
А есть ли такая функция? (задержки в точке вызова)
Или как тогда правильно вызвать timer->start? Или это уже другая задача и надо ориентироваться на код по перерисовке экрана (основной вопрос)? Его я тоже вставлял:
Код:
void MainFr::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::darkGreen);
    painter.setBrush(QBrush(Qt::darkGreen, Qt::SolidPattern)); // Чем красим
    painter.drawRect(2, 2, Rect_size-2, Rect_size);
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    timer->start(1000);
    painter.drawRect(455-Rect_size-2, 2, Rect_size, Rect_size);
    painter.drawRect(910-Rect_size-2, 2, Rect_size, Rect_size);
    painter.drawRect(1366-Rect_size-2, 2, Rect_size, Rect_size);
}

но опять безрезультатно(


Название: Re: Развернуть окно
Отправлено: Kurles от Июнь 13, 2013, 20:19
Если я правильно понял, то тебе нужно что-то типа этого черезпопного решения:
Код
C++ (Qt)
void MainFr::paintEvent(QPaintEvent *)
{
   static int x = 0;
   QPainter painter(this);
   painter.setRenderHint(QPainter::Antialiasing);
   painter.setPen(Qt::darkGreen);
   painter.setBrush(QBrush(Qt::darkGreen, Qt::SolidPattern)); // Чем красим
   // можно через switch
   if (x >= 0)
       painter.drawRect(2, 2, Rect_size-2, Rect_size);
   if (x >= 1)
       painter.drawRect(455-Rect_size-2, 2, Rect_size, Rect_size);
   if (x >= 2)
       painter.drawRect(910-Rect_size-2, 2, Rect_size, Rect_size);
   if (x >= 3)
       painter.drawRect(1366-Rect_size-2, 2, Rect_size, Rect_size);
   ++x;
   x = x%4;
}
Естественно должен быть где-то извне заведен таймер на слот update виджета MainFr.


Название: Re: Развернуть окно
Отправлено: Victor007 от Июнь 14, 2013, 00:11
Kurles, спасибо! Нет-нет, Вы неправильно меня поняли) Наверное, не стоило приводить код. Понимаете, у меня с алгоритмикой все в порядке, я программировал, например, на Builder (и не только), так что какие-то представления есть. Такую программку в нем я бы написал за очень короткое время.
Я бьюсь с тем, чтобы Qt у меня выполнил простейшую функцию задержки (а-ля, delay). Так что ваш совет из предыдущего поста:
Код:
QTimer *timer = new QTimer(this);
    //...
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    timer->start(1000);
должен был бы полностью решить мою проблему.
Беда в том, что я никак не могу "догнать" логику Qt. Читаю, пытаюсь что-то писать, вроде разобрался с сигналами и слотами минимально, но пока самые простейшие шаги идут очень туго.
Поэтому не могли бы Вы подробнее написать, как именно завести таймерна слот update виджета MainFr?
Надо ли как-то определять timeout() и update()? 


Название: Re: Развернуть окно
Отправлено: Victor007 от Июнь 14, 2013, 00:30
Я подумал, что, может быть, проще выложить проект, который у меня на данный момент получился. Программа выводит ряд прямоугольников в верхней части экрана. Мне необходимо, чтобы прямоугольники рисовались не одновременно, а с небольшой задержкой. Если бы Вы указали, в какой файл мне надо вписать тот код, который Вы приводили, это был бы идеальный вариант.


Название: Re: Развернуть окно
Отправлено: Bepec от Июнь 14, 2013, 07:56
Вот вам мини пример с буфером.

https://dl.dropboxusercontent.com/u/62712483/Other/testPaint.zip

PS я слаб в графике, можно считать мой дебют.



Название: Re: Развернуть окно
Отправлено: Victor007 от Июнь 14, 2013, 15:06
Ого! Круто. Это то, над чем я бился почти неделю. У Вас наверное заняло меньше получаса. Да уж, есть, к чему стремиться. Буду сидеть, разбираться в коде. Спасибо большое!


Название: Re: Развернуть окно
Отправлено: Bepec от Июнь 14, 2013, 18:14
Минут 5 с помощью темы с этого форума.

PS хвастаюсь :/


Название: Re: Развернуть окно
Отправлено: Victor007 от Июнь 14, 2013, 19:31
Верес, спасибо еще раз! Посмотрите, пожалуйста, лс, я отправил Вам сообщение. Сообщите, дошло ли оно, здесь немного странно работает личка. Спасибо!


Название: Re: Развернуть окно
Отправлено: Bepec от Июнь 14, 2013, 22:24
Дошло, ответил. Ничуть не странно, просто непривычно :)