crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Рисование на динамической форме
tumanovalex
  опции профиля:
сообщение 4.4.2011, 18:42
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 6.8.2008
Пользователь №: 253

Спасибо сказали: 0 раз(а)




Репутация:   0  


При нажатии на кнопке основной формы создаю окно и хочу нарисовать на нем линию по диагонали на весь экран:
  QWidget *widget = new QWidget(0);
  QPalette p(widget->palette());
  p.setColor(QPalette::Background, Qt::white);
  widget -> setPalette(p);
  QShortcut *shortcut =  new QShortcut(QKeySequence("Esc"), widget);
  connect(shortcut, SIGNAL(activated()), widget, SLOT(close()));
  QRect scrgeom = QApplication::desktop() -> screenGeometry();
  int ymax = scrgeom.height();
  int xmax = scrgeom.width();
  QPainter painter(widget);
  QPen     pen(Qt::black);
  pen.setStyle(Qt::SolidLine);
  pen.setWidth(10);
  painter.setPen(pen);
  painter.drawLine(0, 0, xmax, ymax);
  widget -> setCursor(QCursor( Qt::BlankCursor ));
  widget -> showFullScreen();
Окно создается, но вот линии на нем нет. Если заранее создать класс для widget и в нем определить paintEvent с рисованием линий, то, как я понимаю, все будет нормально перерисовываться. А без создания класса для виджета нельзя обойтись? Как-нибудь определить в моем коде widget->paintEvent и указать функцию, которая будет обрабатывать перерисовку?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.4.2011, 14:12
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9655
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(tumanovalex @ 4.4.2011, 21:42) *
на весь экран:
или на всё окно?

tumanovalex, рисование в Qt осуществляется только в обработчике события paintEvent() некого виджета. Т.е. тебе нужно создать наследника от QWidget, объявить в нём метод paintEvent() и в нём рисовать.

Цитата(tumanovalex @ 4.4.2011, 21:42) *
А без создания класса для виджета нельзя обойтись?
можно, но это будет посложнее.

Цитата(tumanovalex @ 4.4.2011, 21:42) *
Как-нибудь определить в моем коде widget->paintEvent и указать функцию, которая будет обрабатывать перерисовку?
нет, так в Си++ не получится.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
tumanovalex
  опции профиля:
сообщение 6.4.2011, 8:27
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 6.8.2008
Пользователь №: 253

Спасибо сказали: 0 раз(а)




Репутация:   0  


Попробовал реализовать рисование через класс, в QTCreator получаю невнятную ошибку:
error: No rule to make target `Makefile.Debug'.  Stop
в Visual Studio более подробную ошибку:
F:\myprogramqt\mylearningqt\mywindow.h(16) : warning C4100: e: неиспользованный формальный параметр
Компоновка...
mainwindow.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: virtual __thiscall MyWindow::~MyWindow(void)" (??1MyWindow@@UAE@XZ) в функции "public:
virtual void * __thiscall MyWindow::`scalar deleting destructor'(unsigned int)" (??_GMyWindow@@UAEPAXI@Z)
debug\MyLearningQT.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
Подскажите, пожалуйста, в чем моя ошибка? Прикрепляю проект.
Прикрепленные файлы
Прикрепленный файл  MyLearningQT.zip ( 6 килобайт ) Кол-во скачиваний: 45
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 6.4.2011, 8:45
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


у тебя нет реализации конструктора и деструктора для класса MyWindow, хотя есть объявление (в этом случае код автоматически не генерится компилером). Поэтому и ругается.

class MyWindow : public QWidget
{
    Q_OBJECT

public:
    explicit MyWindow(QWidget *parent = 0){};
    ~MyWindow(){};
    
    void paintEvent(QPaintEvent *e)
    {
      QPainter painter(this);
      QPen    pen(Qt::black);
      pen.setStyle(Qt::SolidLine);
      pen.setWidth(10);
      painter.setPen(pen);
      painter.drawLine(0, 0, 100, 100);
    }

    private slots:

  
};

можно сделать так , тогда все заработает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 6.4.2011, 9:10
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Все относительно просто.
Есть такой класс QPainterPath. Он определяет набор фигур, которые потом может рисовать QPainter (см. в документации)

Ты делаешь виджет, который имеет в паблике экземпляр класса QPainterPath и в методе paintEvent, просто рисуешь этy path)

Т.к. экземпляр класса QPainterPath у тебя в паблике - ты можешь когда угодно его поменять и соответственно поменяется рисунок на твоем виджете
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 20.8.2019, 16:39