Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Рисование на динамической форме
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
tumanovalex
При нажатии на кнопке основной формы создаю окно и хочу нарисовать на нем линию по диагонали на весь экран:
  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
Цитата(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
Попробовал реализовать рисование через класс, в 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 неразрешенных внешних элементов
Подскажите, пожалуйста, в чем моя ошибка? Прикрепляю проект.
wiz29
у тебя нет реализации конструктора и деструктора для класса 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
Все относительно просто.
Есть такой класс QPainterPath. Он определяет набор фигур, которые потом может рисовать QPainter (см. в документации)

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

Т.к. экземпляр класса QPainterPath у тебя в паблике - ты можешь когда угодно его поменять и соответственно поменяется рисунок на твоем виджете
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.