Просмотр сообщений
|
Страниц: [1] 2
|
1
|
Qt / Вопросы новичков / Компановка элементов
|
: Ноябрь 03, 2020, 12:53
|
Здравствуйте всем! Необходимо сделать кнопку extended, скрывающую часть элементов. Переместил все, что хочу скрыть в widget и по нажатию кнопки скрываю ее. Но при этом окно остается того же размера. ui->extention->setVisible(false); this->resize(this->minimumWidth(), this->minimumHeight()); если вызвать еще раз, то окно приобретает минимальный размер. Подскажите, как добиться нужного результата?
|
|
|
2
|
Qt / Вопросы новичков / Re: Проблема с nativeEvent
|
: Октябрь 14, 2020, 06:33
|
Для таких же дебилов как и я: надо было подписаться на сообщения DEV_BROADCAST_DEVICEINTERFACE notificationFilter;
memset(¬ificationFilter, 0, sizeof(DEV_BROADCAST_DEVICEINTERFACE)); notificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; notificationFilter.dbcc_classguid = GUID_DEVINTERFACE_LIST[0];
devNotify = RegisterDeviceNotification((HANDLE)this->winId(), ¬ificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE); Так. Еще не все. Обнаружил, что при каждом новом появлении или исчезновении устройства сообщения с параметром DBT_DEVICEARRIVAL или DBT_DEVICEREMOVECOMPLETE приходят дважды.
|
|
|
3
|
Qt / Вопросы новичков / Re: Проблема с nativeEvent
|
: Октябрь 14, 2020, 05:15
|
QCoreApplication::installNativeEventFilter ?
Не разобрался как его использовать. Вобщем, такое ощущение что сообщения приходят только первому отрисованному окну.. В обоих случаях отлавливается сообщение WM_DEVICECHANGE Но в случае, когда есть форма авторизации на главное окно приходят только сообщения с параметром DBT_DEVNODES_CHANGED Следующего сообщения с параметром DBT_DEVICEARRIVAL или DBT_DEVICEREMOVECOMPLETE уже не приходит.
|
|
|
4
|
Qt / Вопросы новичков / Re: индексы в прокси модели
|
: Октябрь 06, 2020, 12:51
|
Разве прокси модель это не делает сама?
DataChanged будет вызваться при изменении прокси модели. Если меняется source модель, то у прокси не срабатывает DataChanged. Поэтому подключаю.
|
|
|
5
|
Qt / Вопросы новичков / индексы в прокси модели
|
: Октябрь 06, 2020, 05:03
|
Здравствуйте Использую прокси модель, подключаю сигнал таким образом: connect(sourceModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SIGNAL(dataChanged(QModelIndex,QModelIndex))); Можно ли указать конкретные индексы для обновления? Чтобы последний столбец в прокси модели не обновлялся?
|
|
|
8
|
Qt / Вопросы новичков / Re: Обновление модели
|
: Сентябрь 04, 2020, 05:30
|
Кстати, заметил еще одну вещь - если вызвать метод загрузки данных в конструкторе, то все работает. Если позже - нет. void MainWindow::updateTable() { QList<QString> Measurment; QList<QString> Unit; QList<QString> Current;
Measurment.append("X"); Unit.append("X"); Current.append(QString::number(X, 'f', 3));
Measurment.append("Y"); Unit.append("Y"); Current.append(QString::number(Y, 'f', 3));
Measurment.append("Z"); Unit.append("Z"); Current.append(QString::number(Z, 'f', 3));
paramModel->populateData(Measurment, Unit, Current); } Пока так и оставил. НО это кажется не правильным решением. Где-то на форуме писали А, кажется понял. Если добавляем ряды после конструктора, надо обрамлять это дело beginInsertRows/endInsertRows. Там отстреляются нужные события.
|
|
|
10
|
Qt / Вопросы новичков / Re: Обновление модели
|
: Сентябрь 04, 2020, 05:00
|
Покажи больше кода, непонятно что и как ты делаешь. такое ощущение, что ты пытаешься дернуть сигнал модели снаружи, а тебе нужно эмитить сигнал из модели после изменения данных. В общем, давай код модели.
#ifndef PARAMETERSMODEL_H #define PARAMETERSMODEL_H
#include <QAbstractTableModel>
class ParametersModel : public QAbstractTableModel { Q_OBJECT
public:
explicit ParametersModel(QObject *parent = nullptr);
void populateData(const QList<QString> &Measurment, const QList<QString> &Unit, const QList<QString> &Current);
int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE; int columnCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
private: QList<QString> m_Measurment; QList<QString> m_Unit; QList<QString> m_Current; };
#endif // PARAMETERSMODEL_H
#include "parametersmodel.h"
ParametersModel::ParametersModel(QObject *parent) : QAbstractTableModel(parent)
{ }
void ParametersModel::populateData(const QList<QString> &Measurment, const QList<QString> &Unit, const QList<QString> &Current) { m_Measurment.clear(); m_Measurment = Measurment; m_Unit.clear(); m_Unit = Unit; m_Current.clear(); m_Current = Current; emit dataChanged(index(0, 0), index(rowCount(), columnCount())); return; }
int ParametersModel::rowCount(const QModelIndex &parent) const { Q_UNUSED(parent); return m_Measurment.length(); }
int ParametersModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent); return 3; }
QVariant ParametersModel::data(const QModelIndex &index, int role) const { if (!index.isValid() || role != Qt::DisplayRole) { return QVariant(); } if (index.column() == 0) { return m_Measurment[index.row()]; } else if (index.column() == 1) { return m_Unit[index.row()]; } else if (index.column() == 2) { return m_Current[index.row()]; } return QVariant(); }
QVariant ParametersModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role == Qt::DisplayRole && orientation == Qt::Horizontal) { if (section == 0) { return QString("Измерение"); } else if (section == 1) { return QString("ед. изм."); } else if (section == 2) { return QString("Текущее значение"); } } return QVariant(); }
при изменении данных вызываю paramModel->populateData(Measurment, Unit, Current);
|
|
|
11
|
Qt / Вопросы новичков / Обновление модели
|
: Сентябрь 03, 2020, 14:24
|
Здравствуйте. Есть модель QAbstractTableModel почему-то не обновляет модель при изменении данных. Если изменить размер родительского окна, то начинает обновлять Пробовал Model->dataChanged(index(0, 0), index(1, 1)); QMainwindow::update() QMainwindow::repaint()
|
|
|
12
|
Qt / Вопросы новичков / QSlider
|
: Август 31, 2020, 12:38
|
Здравствуйте! Задача:
при перемещении слайдера показывать изменяемое значение. Запись в файл производить при окончании действия со слайдером (иначе запись в файл будет производиться постоянно при перемещении слайдера).
Обрабатываю два сигнала: valueChanged для отображения изменяемого значения и sliderRelised для записи.
Нужно обрабатывать запись при перемещении слайдера тиками (нажатиями мыши) значение меняется, но когда при этом производить запись?
|
|
|
13
|
Qt / Вопросы новичков / Проблема с nativeEvent
|
: Август 21, 2020, 12:28
|
Нашел метод определения VID PID вставляемого устройства. bool MainWindow::nativeEvent([[maybe_unused]] const QByteArray& eventType, void *message, [[maybe_unused]] long *result) {
MSG *msg = static_cast< MSG * >(message); int msgType = msg->message; if (msgType == WM_DEVICECHANGE) { if (msg->wParam == DBT_DEVICEARRIVAL || msg->wParam == DBT_DEVICEREMOVECOMPLETE) { PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam; PDEV_BROADCAST_DEVICEINTERFACE lpdbv = (PDEV_BROADCAST_DEVICEINTERFACE) lpdb; if (lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { QString path = QString::fromWCharArray(lpdbv->dbcc_name); qDebug()<<path; m_DevConnect->VID = ""; m_DevConnect->PID = ""; m_DevConnect->SN = ""; if (!path.isEmpty()) { if (path.contains("VID_", Qt::CaseInsensitive)) m_DevConnect->VID = path.mid(path.indexOf("VID_")+4, 4); if (path.contains("PID_", Qt::CaseInsensitive)) m_DevConnect->PID = path.mid(path.indexOf("PID_")+4, 4); QRegExp rx("#\\w{8}#"); if (path.contains(rx)) m_DevConnect->SN = path.mid(rx.indexIn(path)+1, 8); m_isBoardConnected = path.contains(VID_CP2112, Qt::CaseInsensitive); m_isOPMConnected = path.contains(VID_OPM, Qt::CaseInsensitive); } else return false;
if (msg->wParam == DBT_DEVICEARRIVAL) emit SigUsbArrived(path); else emit SigUsbRemoved(path); return true; } } } return false; }
Все прекрасно работает. Но если до вызова главного окна MainWindow было какое-то другое окно, метод перестает вызываться. Сейчас обхожусь таким способом: w.show(); w.hide(); w.display();
в запускается другая форма. Как это побороть? может быть есть способ?
|
|
|
14
|
Qt / Вопросы новичков / Re: Ошибка QSqlError "2026"
|
: Август 21, 2020, 10:30
|
Разобрался. При дебаге запросы шли по протоколу TLSv1.1, а при релизе TLSv1.3. Протокол TLSv1.3 пришел на замену TLSv1.1 и вполне возможно не все компиляторы успели обновиться. Поменял компилятор и все заработало.
|
|
|
|
|