При нажатии на кнопке основной формы создаю окно и хочу нарисовать на нем линию по диагонали на весь экран:
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 и указать функцию, которая будет обрабатывать перерисовку? Попробовал реализовать рисование через класс, в 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 неразрешенных внешних элементов
Подскажите, пожалуйста, в чем моя ошибка? Прикрепляю проект.
у тебя нет реализации конструктора и деструктора для класса 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:
};
Все относительно просто.
Есть такой класс QPainterPath. Он определяет набор фигур, которые потом может рисовать QPainter (см. в документации)
Ты делаешь виджет, который имеет в паблике экземпляр класса QPainterPath и в методе paintEvent, просто рисуешь этy path)
Т.к. экземпляр класса QPainterPath у тебя в паблике - ты можешь когда угодно его поменять и соответственно поменяется рисунок на твоем виджете
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)