Russian Qt Forum
Ноябрь 22, 2024, 18:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Рисование QPainter и форма .ui главного окна  (Прочитано 3129 раз)
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« : Июнь 30, 2020, 19:02 »

Здравствуйте.

В программе имеется форма главного окна, там масса виджетов - таб бар, в каждой вкладке кнопки, поля, чекбоксы и прочее... Все это богатство было на скорую руку создано в 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?
« Последнее редактирование: Июнь 30, 2020, 19:41 от PinkPanther » Записан

Эвтаназия - наше хобби!
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Июнь 30, 2020, 22:41 »

1. а этот виджет хотя бы отображается?
2. правой кнопкой на добавленный виджет — promote to — вписать свой класс
3. можно повесить виджет поверх лейбла и в нем рисовать
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« Ответ #2 : Июль 01, 2020, 11:29 »

1. а этот виджет хотя бы отображается?
2. правой кнопкой на добавленный виджет — promote to — вписать свой класс
3. можно повесить виджет поверх лейбла и в нем рисовать

Заработало. Оказывается, в layout-е виджет попадал в слепую зону, уползал за пределы окна.
Мысль наложить область поверх картинки отличная. Унаследовал от QLabel, задал геометрию картинки, очень удобно.
Спасибо!
Записан

Эвтаназия - наше хобби!
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.225 секунд. Запросов: 22.