Просмотр сообщений
|
Страниц: [1] 2
|
1
|
Qt / Пользовательский интерфейс (GUI) / QTableView стиль выделения
|
: Апрель 12, 2023, 12:25
|
Коллеги, добрый день Есть табличка с раскрашенными в разные цвета строками (белый и синий). На текущий момент использую стиль QTableView::item:selected {background: " + QString(COLOR_STANDARD_TABLE_CURSOR) + "; color: " + QString(COLOR_BLACK) + "} Однако получается так, что при выделении строки, вне зависимости от того какого цвета был бэкграунд строки она подкрашивается в цвет COLOR_STANDARD_TABLE_CURSOR, что собственно не удивительно Использование цвета с прозрачностью не привел к каким либо результатам, прозрачность просто игнорируется и цвет вылеления одинаков на всех строках, вне зависимости от их бэкграунд цвета. QTableView {selection-background-color: rgba(255, 0, 0, 50)} Собственно вопрос: есть ли возможность подсвечивать выделение прозрачным цветом? Как задать бордер выделения всей строки, а не каждого итема для строки? QTableView {selection-background-color: rgba(255, 0, 0, 50);border: 3px solid black} Заранее спасибо за помощь
|
|
|
2
|
Qt / Пользовательский интерфейс (GUI) / QGraphicsView, ограничение зуммирования
|
: Август 10, 2022, 14:38
|
Добрый день, первый раз сталкиваюсь с рисованием в Qt Подскажите пожалуйста как задать рамки для зума. Само увеличение и уменьшение реализовано довольно тривиально: void GraphicsView::wheelEvent(QWheelEvent *e) { if (e->modifiers() & Qt::ControlModifier) { if (e->angleDelta().y() > 0) view->zoomIn(); else view->zoomOut(); e->accept(); } else { QGraphicsView::wheelEvent(e); } }
// -----------------------------------------------------------
class View : public QFrame { Q_OBJECT public: explicit View(const QString &, QWidget *parent = nullptr);
QGraphicsView *view() const; .... }
void View::setupMatrix() { qreal scale = qPow(qreal(2), (zoomValue - 250) / qreal(50)); QTransform matrix; matrix.scale(scale, scale); matrix.rotate(0); graphicsView->setTransform(matrix); setResetButtonEnabled(); }
void View::zoomIn() { if (zoomValue + ZOOMDELTAVALUE <= ZOOMMAX) { zoomValue += 6; setupMatrix(); } }
void View::zoomOut() { if (zoomValue - ZOOMDELTAVALUE >= ZOOMMIN) { zoomValue -= 6; setupMatrix(); } }
// -----------------------------------------
scene = new QGraphicsScene(this); View *view = new View("", this); view->view()->setScene(scene); scene->addPixmap(QPixmap(":/icons/images/russia.png"));
Как сделать так, чтобы нельзя было уменьшить меньше, чем минимальный размер одной из сторон установленной на сцену картинки, ну и увеличить, например более чем на одну треть от минимальной стороны установленной картинки. Чтоб не было такой ситуации: http://
|
|
|
3
|
Qt / Пользовательский интерфейс (GUI) / Re: QComboBox со строкой ввода
|
: Июнь 09, 2022, 09:31
|
Тему Вы конечно подняли довольно таки спорную и холиварную.... )) 1 По поводу отключения автодополнения через флаг QCompleter мне кажется очень логичным, по аналогии с другими флагами фреймфорка, например QAbstractItemView::NoSelection. 2 Чекбоксы в комбобоксе расширяют его возможности до флага QAbstractItemView::MultiSelection в табличках. как по мне очень удобно там, где нет места для табличного представления. 3 . Пусть принципы организации UI/UX сформулированы не нами, но чтобы их модифицировать, нужны весьма веские основания. Да, например "требование дизайнера" является веским основанием или нет? В следующий раз отправлю им Вашу цитату . В то же самое время разработчики фреймворка почему то не сделали UI классы final... А если пойти шире то многие "прокачивают" автомобили, а не ездят на стандартных комплектациях, многие делаю ремонт в квартирах а не живут в типовых коробочках Иногда бывает и так что приходится модифицировать стандартное поведение UI. 4 Как я понимаю форумы нужны для решения технических вопросов, с которыми некоторые люди не могут справиться по различным причинам. Если акцентироваться на "зачем делать", а не "как делать", то 99% тем, НЕ относящихся к категории "помогите новичку" можно закрыть с формулировкой "зачем тебе это надо так никто не делает". Со всем уважением и спасибо за помощь в параллельных темах
|
|
|
4
|
Qt / Пользовательский интерфейс (GUI) / Re: QComboBox со строкой ввода
|
: Июнь 08, 2022, 00:23
|
Спасибо за наводку ... не знал об этом классе Для меня идеально подошло: cblAir->lineEdit()->completer()->blockSignals(true); Для будущих потомков: может кому то будет интересно поиграться с различными видами автодополнения QCompleter::PopupCompletion 0 Current completions are displayed in a popup window. QCompleter::InlineCompletion 2 Completions appear inline (as selected text). QCompleter::UnfilteredPopupCompletion 1 All possible completions are displayed in a popup window with the most likely suggestion indicated as current. Устанавливаются методом void setCompletionMode(QCompleter::CompletionMode mode) Странно что по аналогии с другими флагами нет что то типа QCompleter::NoCompletion
|
|
|
5
|
Qt / Пользовательский интерфейс (GUI) / QComboBox со строкой ввода
|
: Июнь 07, 2022, 17:13
|
Добрый день, Использую QComboBox со свойством setEditable(true) В данном режиме вверху комбобокса появляется lineEdit в кототом можно вводитьтекст Данный lineEdit я использую для поиска и фильтрации значений в комбобокс. Однако, когда я ввожу текст, то Qt подставляет первый подходящий элемент из списка. Можно как то отключить это? Скрин прикреплен по ссылке. В строку ввода я написал ".V", все остальное дописалось автоматически, что очень мешает, так как по сигналу currentTextChanged отслеживаю изменения текста. https://disk.yandex.ru/i/ZJNeaHp6arnldg
|
|
|
9
|
Qt / Общие вопросы / Re: Выборка списка
|
: Июнь 06, 2022, 21:36
|
Как всегда при решении проблемы углубился в дебри, хотя решение на поверхности QStringList QStringList::filter(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const В принципе метода выше вполне достаточно Однако для общего развития если кто-то подскажет как решить задачу с помощью QRegExp (необходима совместимость с Qt 4. буду благодарен.
|
|
|
10
|
Qt / Общие вопросы / Выборка списка
|
: Июнь 06, 2022, 21:31
|
Добрый день, неожиданно столкнулся со следующей тривиальной задачей, безрезультативно отнявшей у меня довольно много времени
Есть QLineEdit в который пользователь вводит текст Есть заполненный QStringList
Задача такая: при вводе строки в списке должны оставаться только те строки, которые начинаются с уже введеных в строку ввода символов.
Как я понимаю задача просто реализуется с помощью регулярных выражений, но что-то я подтупливаю с ними. Буду благодарен за посильную помощь.
|
|
|
12
|
Qt / Пользовательский интерфейс (GUI) / QComboBox + CheckBox Delegate
|
: Июнь 04, 2022, 00:32
|
Есть выпадающий комбобокс с реализованным делегатом (итемы - чекбоксы) class CheckBoxListDelegate;
class CheckBoxList: public QComboBox { Q_OBJECT public: CheckBoxList(QString text, QWidget *widget = 0); virtual ~CheckBoxList(); virtual void paintEvent(QPaintEvent *); public slots: void SetDisplayText(QString strr); QString GetDisplayText() const; private: CheckBoxListDelegate * delegate; QString m_DisplayText; private slots: void act (); }; CheckBoxList::CheckBoxList(QString text, QWidget *widget ) :QComboBox(widget),m_DisplayText(text) { delegate = new CheckBoxListDelegate(this); view()->setItemDelegate(delegate); view()->setEditTriggers(QAbstractItemView::CurrentChanged); connect(delegate,SIGNAL(dataChanged()),this,SLOT(act())); }
CheckBoxList::~CheckBoxList() { }
void CheckBoxList::act() { emit activated(0); }
void CheckBoxList::paintEvent(QPaintEvent *) { QStylePainter painter(this); painter.setPen(palette().color(QPalette::Text));
// draw the combobox frame, focusrect and selected etc. QStyleOptionComboBox opt; initStyleOption(&opt);
// if no display text been set , use "..." as default if(m_DisplayText.isNull()) opt.currentText = "..."; else opt.currentText = m_DisplayText; painter.drawComplexControl(QStyle::CC_ComboBox, opt);
// draw the icon and text painter.drawControl(QStyle::CE_ComboBoxLabel, opt); }
void CheckBoxList::SetDisplayText(QString strr) { m_DisplayText = strr; }
QString CheckBoxList::GetDisplayText() const { return m_DisplayText; }
Делегат: class CheckBoxListDelegate : public QItemDelegate { Q_OBJECT signals: void dataChanged () const; public slots: void dCH () { emit dataChanged(); } public: CheckBoxListDelegate(QObject *parent) : QItemDelegate(parent) { }
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { //Get item data bool value = index.data(Qt::UserRole).toBool(); QString text = index.data(Qt::DisplayRole).toString();
// fill style options with item data const QStyle *style = QApplication::style(); QStyleOptionButton opt; opt.state |= value ? QStyle::State_On : QStyle::State_Off; opt.state |= QStyle::State_Enabled; opt.text = text; opt.rect = option.rect;
// draw item data as CheckBox style->drawControl(QStyle::CE_CheckBox,&opt,painter); }
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const { // create check box as our editor QCheckBox *editor = new QCheckBox(parent); return editor; }
void setEditorData(QWidget *editor, const QModelIndex &index) const { //set editor data QCheckBox *myEditor = static_cast<QCheckBox*>(editor); myEditor->setText(index.data(Qt::DisplayRole).toString()); myEditor->setChecked(index.data(Qt::UserRole).toBool());
}
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { //get the value from the editor (CheckBox) QCheckBox *myEditor = static_cast<QCheckBox*>(editor); bool value = myEditor->isChecked();
//set model data QMap<int,QVariant> data; data.insert(Qt::DisplayRole,myEditor->text()); data.insert(Qt::UserRole,value); model->setItemData(index,data); emit dataChanged(); } }; Использование во вью: QHBoxLayout * labLay = new QHBoxLayout (ui->gbLabel); cblLabel = new CheckBoxList (QString::fromLocal8Bit("Выберите метку ..."), ui->gbLabel); labLay->addWidget(cblLabel); connect(cblLabel,SIGNAL(activated(int)),this,SLOT(changedLabelSettings()));
ну и в конце концов данные в выпадающий список предостаялются моделью cblLabel->setModel(metkaModel); То есть изменение "отмеченности" чекбокса прокитдывается из делегата. Код писался давно и по какому то примеру, точно уже не вспомню. Однако сомнения закрались в коректности такого подхода, прочетом статей, но без примеров как правильно уведомить вью об изменении данных А так же коспилятор рисуте ворнинги напротив константных сигналов делегата и слота класса CheckBoxList. Однако константность убрать невозмоно так как сигнал эмитится констатнтным методом Подскажите пожалуйста как сделать красиво.
|
|
|
14
|
Qt / Базы данных / Re: Работа с БД в отдельном потоке
|
: Июнь 01, 2022, 23:20
|
Да, спасибо я знаю Результат возвращаю во вью через указатель на QSqlQuery void SqlQueryExecutor::slotGet618Data(uint turplesCount) { if (!QSqlDatabase::database().isOpen()) { emit dbDbErrorAppears(QSqlError::ConnectionError, tr("Ошибка подключения к БД."), ""); return; } QSqlQuery * query618 = new QSqlQuery (); QString sty; if (turplesCount == 0) sty = QString ("%1 %2 ORDER BY id DESC ").arg(strQueryA618, strWhereA618); else sty = QString ("%1 %2 ORDER BY id DESC %3 %4").arg(strQueryA618, strWhereA618, "LIMIT").arg(turplesCount); query618->exec(sty); if (query618->lastError().isValid()) { emit dbDbErrorAppears(query618->lastError().type(), query618->lastError().text(), ""); return; } emit set618Data(query618); }
|
|
|
15
|
Qt / Базы данных / Соединение с несуществующей БД
|
: Июнь 01, 2022, 23:11
|
Коллеги, добрый день, Как обработать ошибку ошибочного ввода IP сервера БД? Довольно стандартная функция подключения к БД: void SqlQueryExecutor::slotOpenDbConnection(QString address, QString serverName, QString login, QString password) { if (QSqlDatabase::database().isOpen()) { QString connectionName = QSqlDatabase::database().connectionName(); QSqlDatabase::database(connectionName).close(); QSqlDatabase::removeDatabase(connectionName); } QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); db.setHostName(address); db.setDatabaseName(dbName); db.setUserName(login); db.setPassword(password); if (!db.open()) { if (db.lastError().isValid()) emit dbDbErrorAppears(db.lastError().type(), db.lastError().text(), serverName); return; } emit dbConnected(serverName); } Когда на сервере развернута БД все ок, соединение устанавливается, либо не устанавливается по каким то причинам. Но если мы подключаемся по несуществующему IP поток зависает на функции open на довольно продолжительное время. и в конце концов получаю ответ could not connect to server: Время ожидания соединения истекло Is the server running on host "10.248.0.2" and accepting TCP/IP connections on port 5432? QPSQL: Unable to connect Как это время можно сократить?
|
|
|
|
|