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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Widgets on top of QGLWidget  (Прочитано 5086 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« : Июль 15, 2014, 16:53 »

Здравствуйте!
Помогите, пожалуйста разобраться, каким образом можно добавить, к примеру, кнопку на QGLWidget.

Я попробовал создать QHBoxLayout, на который добавил QPushButton и QLabel, но получил в итоге два белых прямоугольника...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Июль 15, 2014, 17:41 »

Проверил - добавляется без проблем (Qt 5.2, Win7)
Код
C++ (Qt)
#include <QtWidgets>
#include <QGLWidget>
 
#define PARENT_CLASS QGLWidget
 
class MyWidget : public PARENT_CLASS {
public:
MyWidget( QWidget * parent = 0 ) : PARENT_CLASS(parent)
{
}
 
void paintGL( void )
{
qDebug() << "paintGL";
}
 
void mousePressEvent( QMouseEvent * )
{
update();
}
 
void paintEvent( QPaintEvent * )
{
static int theCount = 0;
qDebug() << "paintEvent" << ++theCount;
QPainter painter(this);
painter.fillRect(rect(), Qt::gray);
QColor color[] = { Qt::red, Qt::green, Qt::blue };
int width = rect().width();
int height = rect().height();
QRect R(0, 0, width / 5, height / 5);
for (int i = 0; i < 10; ++i)
painter.fillRect(R.translated(qrand() % width, qrand() % height), color[qrand() % 3]);
}
};
 
int main( int argc, char **argv )
{
QApplication app(argc, argv);
 
QDialog * dlg = new QDialog;
dlg->setGeometry(100, 100, 400, 400);
 
MyWidget * mw = new MyWidget(dlg);
mw->setGeometry(0, 0, 400, 400);
 
QPushButton * btn = new QPushButton("Button", dlg);
btn->setGeometry(10, 10, 60, 20);
 
dlg->show();
 
return app.exec();
}
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Июль 15, 2014, 21:15 »

Спасибо.
Я пытался создавать кнопку в конструкторе класса, назначая родителем сам класс... Видимо, так делать нельзя.
Igors, я заметил, что в Вашем примере имеется черная рамка вокруг кнопки. Можно ли добиться "гладкости" и "плавности" интерфейса как в современных CAD/CAE системах? (Например как в SolidWorks, написанном на .NET, см. аттач. Дерево, кнопочки в окне рисования...)
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Июль 15, 2014, 21:33 »

Снова словил прорисовку прямоугольника вместо кнопки... Причина ясна, хочется понять почему...
Вот рабочий код, при котором всё происходит так как ожидается:
Код:
#include <QtWidgets>
#include <QGLWidget>
#include <QHBoxLayout>

class MyWidget : public QGLWidget {
public:
    MyWidget( QWidget * parent = 0 ) : QGLWidget(parent)
    {
        QHBoxLayout* lay = new QHBoxLayout(this);
        QPushButton * btn = new QPushButton("Button", this);
        lay->addWidget(btn);
    }

    void paintGL( void )
    {
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
    }
};

int main( int argc, char **argv )
{
    QApplication app(argc, argv);

    QDialog * dlg = new QDialog;
    dlg->setGeometry(100, 100, 400, 400);
    MyWidget * mw = new MyWidget(dlg);
    QHBoxLayout lay;
    lay.addWidget(mw);
    dlg->setLayout(&lay);

    dlg->show();

    return app.exec();
}
Но стоит мне вывести QGLWidget отдельным окном, как проявляется этот эффект:
Код:
int main( int argc, char **argv )
{
    QApplication app(argc, argv);

    QDialog * dlg = new QDialog;
    dlg->setGeometry(100, 100, 400, 400);
    MyWidget * mw = new MyWidget(0);
//    QHBoxLayout lay;
//    lay.addWidget(mw);
//    dlg->setLayout(&lay);

    mw->show();

    return app.exec();
}
Почему так происходит?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июль 16, 2014, 10:07 »

Но стоит мне вывести QGLWidget отдельным окном, как проявляется этот эффект:
Установите для QGLWidget
Код
C++ (Qt)
setAttribute(Qt::WA_PaintOnScreen, false);
 
Вообще может для Вас есть смысл использовать "OpenGL сборку" Qt (сам не пробовал)

Можно ли добиться "гладкости" и "плавности" интерфейса как в современных CAD/CAE системах? (Например как в SolidWorks, написанном на .NET, см. аттач. Дерево, кнопочки в окне рисования...)
Ну а чего ж нельзя, рисовать все в OpenGL c анти-алиасом, не исключено Qt это уже и делает. Другое дело что это "всего лишь UI" т.е. небольшая часть всей работы. Было бы чему посвятить это рисование, а "само по себе" оно бесцельно
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Июль 16, 2014, 10:43 »

Установите для QGLWidget
Код
C++ (Qt)
setAttribute(Qt::WA_PaintOnScreen, false);
 
Вообще может для Вас есть смысл использовать "OpenGL сборку" Qt (сам не пробовал)
Приведенный Вами код вызывает ошибку Sigmentation fault при исполнении строки return app.exec();

Я использую именно OpenGL сборку.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июль 16, 2014, 11:06 »

Приведенный Вами код вызывает ошибку Sigmentation fault при исполнении строки return app.exec();
У меня не вызывает Улыбающийся Почему происходит... ну даже если бы я знал почему - это не метод где-то раздобыть/прочитать ответ. Надо смотреть консоль и (довольно долго) шагать в отладчике, Тогда станет ясно - может флаг какой-то нужно устанавливать (так часто бывает), а может это просто не поддерживается. И цель ставить более четко/практично: рисовать поверх можно, ну не будем делать QGLWidget окном (это и не нужно). 
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #7 : Июль 16, 2014, 12:08 »

И цель ставить более четко/практично: рисовать поверх можно, ну не будем делать QGLWidget окном (это и не нужно). 
Согласен. Это было просто желание разобраться, так сказать, для себя.
На деле я уже реализовал всё, что мне нужно было.
Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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