Здравствуйте.
В программе имеется форма главного окна, там масса виджетов - таб бар, в каждой вкладке кнопки, поля, чекбоксы и прочее... Все это богатство было на скорую руку создано в Qt Creator-е. Возникла необходимость разместить в одной из вкладок объект рисования - линии, прямоугольники и все такое прочее... Был создан класс Keyboard, дочерний от QWidget, в котором был переопределен метод paintEvent. Объект был создан вручную, в конструкторе MainWindow, а в ui такого объекта нет. Если сделать его centralWidget, все работает и рисуется. Когда запихиваю в один из лейаутов формы, виджета на экране нет и обращений к его paintEvent не происходит.
// keyboard.cpp
void Keyboard::paintEvent(QPaintEvent * event)
{
Q_UNUSED(event);
QPainter p; // Создаём новый объект рисовальщика
p.begin(this);
p.setRenderHint(QPainter::Antialiasing, true);
p.setPen(QPen(Qt::red, 25, Qt::DotLine)); // Настройки рисования
p.drawLine(0, 0, width(), height()); // Рисование линии
...
p.end();
}
// mainwindow.cpp
...
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent) , ui(new Ui::MainWindow)
{
...
keys = new Keyboard();
this->setCentralWidget(keys); // Так работает. Когда не делаю главным окном, а добавляю в verticalLayout (3 строчки ниже), не работает.
//keys->resize(200,200);
//ui->verticalLayout->addWidget(keys);
//keys->show();
...
}
Вопрос 1: В чем загвоздка?! (Давным-давно писал программу с рисованием и все работало, но исходников не осталось)
Вопрос 2: Как добавить потомка QWidget (с переопределенным обработчиком события рисования) в форму .ui?
Вопрос 3: В одну из QLabel (элемент формы .ui) из файла ресурсов подгружается картинка .jpg, в том же конструкторе MainWindow. Картинка грузится прекрасно. Было бы неплохо дорисовать кое-что поверх картинки, но не меняя исходное изображение. То есть по умолчанию пользователь видит оригинальную картинку, время от времени - по мере его действий - на картинке появляются стрелки, фигуры и надписи, а потом исчезают. В потомке QLabel тоже будет переопределен метод обработчика paintEvent, и в зависимости от состояния свойств либо что-то будет дорисовываться, либо не будет. Как сделать так, чтобы картинка не перекрывала рисование и как производный ่от QLabel объект добавить в форму .ui?