Просмотр сообщений
|
Страниц: 1 2 3 [4]
|
46
|
Qt / Вопросы новичков / Re: Масштабирование и прокрутка графиков по отдельности
|
: Август 22, 2017, 11:52
|
Не пойму, как тут прозрачный фон помогает... QLayout уже не модно ? Проблема в том, что при использовании QLayout мне не удалось установить прозрачность виджета QOpenGLWidget , он отображается с черным фоном, хоть ты тресни. А вот если виджеты поместить на сцену, то прозрачность есть. Я работаю в Qt три недели, возможно чего-то еще не понимаю, поэтому заранее прошу меня извинить за все глупости. Мои графики имеют несколько сотен тысяч значений, занимают всю область окна и пересекаются друг с другом во множестве мест. Перерисовать отдельную область не получится. Поэтому изначально хотелось реализовать систему слоев, чтобы работать с каждым графиком отдельно в своем слое(масштабировать, изменять промежутки отображения) и не перерисовывать остальные. Задача поставлена реализовать в OpenGL. Поэтому и использую виджеты QOpenGLWidget с прозрачным фоном. Прозрачность устанавливаю с помощью в конструкторе и QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions(); f->glClearColor(0, 0, 0, 0);
в initializeGL(). Еще одна проблема - масштабирование всего окна приводит к скачкообразному масштабированию всех слоев - виджетов. После многочисленных экспериментов прихожу к выводу, что проблема в QOpenGLWidget. Если взять и положить простые виджеты QWidget друг на друга: chart::chart(QWidget *parent) : QDialog(parent), ui(new Ui::chart) { ui->setupUi(this);
//Создаем первый виджет QWidget* topWidget=new QWidget(this);
//layout, который кладется на само диалоговое окно QVBoxLayout* curLayout=new QVBoxLayout; curLayout->addWidget(topWidget); setLayout(curLayout);
//layout, который кладется на первый виджет curLayout=new QVBoxLayout; topWidget->setLayout(curLayout);
for (int i = 0; i<10; i++) { //Создать очередной виджет QWidget* w=new QWidget(this); topWidget=w; curLayout->addWidget(w);
//Назначить виджету фон QPalette pall; pall.setColor(w->backgroundRole(), Qt::blue); w->setPalette(pall); w->setAutoFillBackground(true);
//Создать на виджете layout curLayout=new QVBoxLayout; w->setLayout(curLayout); } }
chart::~chart() { delete ui; } Масштабирование окна выполняется идеально. Но если в этом же коде заменить QWidget на QOpenGLWidget то при масштабировании уже можно заметить скачкообразность и фон остается черным. А если заменить на QGLWidget, то при масштабировании эффект вас потрясет...
|
|
|
49
|
Qt / OpenGL / Как установить цвет рисунка в QOpenGLWidget?
|
: Август 21, 2017, 11:45
|
Всем привет! Надеюсь, у вас все хорошо В виджете, который является потомком QOpenGLWidget, рисую линию. Для установки цвета в paintGL() использую: QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions(); f->glColorMask(0, 1, 0, 1); // задаем цвет графика В результате цвет могу установить либо красный, либо синий, либо зеленый (еще черный и белый). А как установить другой цвет? Например, серый... Как в QGLWidget: QColor lightGray = QColor(Qt::gray).light(180); qglColor(lightGray );
|
|
|
50
|
Qt / Вопросы новичков / Масштабирование и прокрутка графиков по отдельности
|
: Август 15, 2017, 14:14
|
Мне нужно отобразить несколько графиков в одном окне. Надо иметь возможность масштабировать и прокручивать графики по отдельности. Для отображения одного графика использую QGLWidget. А как теперь лучше отобразить графики вместе? На ум приходит положить несколько QGLWidget (в каждом нарисован свой график) с прозрачным фоном друг на друга. Или лучше использовать сцену с графическим представлением? Или что-то еще? Посоветуйте...
|
|
|
52
|
Qt / Вопросы новичков / Изменение элементов контейнеров
|
: Август 10, 2017, 12:30
|
Читаю текстовый файл. Каждая строка файла содержит некоторые значения через запятую. N-ое значение относится к n-му каналу. Надо разнести значения по каналам. QStringList lWordsList = row.split ( ",", QString::SkipEmptyParts ); for(int j=0;j<lWordsList.size();j++) { CChannel ch=(CChannel)channelList[j] ;//Здесь создается копия элемента CChannel double val=lWordsList[j].toDouble(); ch.valueList.insert(dt,val); channelList[j]=ch;//пытаюсь внести изменения в список и здесь программа начинает дико тормозить } row - очередная строка из файла. QMap<int, CChannel> channelList - список каналов CChannel. У CChannel есть список значений QMap <QDateTime, double> valueList. Когда пишу CChannel ch=(CChannel)channelList[j]; оказывается создается копия элемента CChannel, и все, что я делаю с этой копией никак не влияет на реальный элемент в списке каналов channelList. Поэтому после всех изменений копии, присваиваю ее j-му элементу списка. Все вроде работает, но проблема в том, что на операторе программа начинает дико тормозить. Без этого оператора 10-мегабайтный файл считывается за 3 сек, с этим оператором - счет идет на часы. Как решить проблему? Как внести изменения в элемент напрямую? Или что-то еще?
|
|
|
53
|
Qt / Вопросы новичков / Re: Как вызвать виджет из dll
|
: Август 09, 2017, 07:40
|
Да, решение явно неверное. При попытке запустить dll под отладчиком получаю ошибку: ASSERT failure in QCoreApplication: "there should be only one application object". Подобное описано и здесь. Если в dll передавать QApplication, то тогда непонятно зачем вообще создавать dll.
|
|
|
54
|
Qt / Вопросы новичков / Re: Как вызвать виджет из dll
|
: Август 04, 2017, 19:49
|
Спасибо за исследование! Правда, оно не совсем для новичков... Я вот не совсем поняла, зачем для создания файла в dll создавать отдельный поток и в нем QCoreApplication? Я думала QCoreApplication нужен для того, чтобы отлавливать события, а здесь никаких событий вроде не ожидается...
|
|
|
55
|
Qt / Вопросы новичков / Re: Как вызвать виджет из dll
|
: Август 04, 2017, 19:11
|
Точно! И если изменить pr(): void Test::pr() //Метод который вызывается при нажатии кнопки в основном приложении { Window w; w.show(); pApp->exec(); }
То все работает! Спасибо огромное!
|
|
|
56
|
Qt / Вопросы новичков / Как вызвать виджет из dll
|
: Август 04, 2017, 12:30
|
Здравствуйте! Работаю в Qt Creator 4.3.1, на Qt 5.9.1 Использую компилятор MinGW 5.3 (Windows10 64x). Мне нужно при нажатии кнопки в основном приложении вызвать виджет из dll. Создала dll. Ниже привожу экспортируемый класс Test. Если конструктор класса оставить пустым, то при нажатии на кнопку появляется ошибка: QWidget: Must construct a QApplication before a QWidget. А если в конструкторе класса создаю объект QApplication, то при компиляции dll появляется ошибка: invalid use of incomplete type 'class QApplication. Если в dll нельзя создавать QApplication, то как правильно вызвать виджет из dll? Примеры в сети в основном сделаны на Q4 и предлагают создать QApplication. #ifndef TEST_H #define TEST_H
#include "test_global.h"
class TESTSHARED_EXPORT Test {
public: Test(); ~Test(); void pr(); };
#endif // TEST_H
#include "test.h" #include "window.h"
QApplication* pApp = NULL;
Test::Test() { int argc=0; char *argv[1]; argv[0]=""; pApp = new QApplication(argc, argv); //здесь ошибка: invalid use of incomplete type 'class QApplication } Test::~Test() { delete pApp; }
void Test::pr() //Метод который вызывается при нажатии кнопки в основном приложении { Window w;// Это мой виджет w.show(); }
Вызов в основном приложении: void MainWindow::on_pushButton_2_clicked() { Test t; t.pr(); }
|
|
|
|
|