Просмотр сообщений
|
Страниц: 1 ... 5 6 [7] 8 9 ... 58
|
92
|
Qt / Базы данных / Re: Работа с БД в отдельном потоке
|
: Май 30, 2022, 22:00
|
Вы не поняли - я предлагаю использовать TableView из того потока, где вы работаете с базой. Т.е. в конструкторе вокера предусматриваете ссылку на вьюшник, ну и в конструкторе делаете tableView-> setModel(model618).
|
|
|
94
|
Qt / Кладовая готовых решений / QTableView: текст ячейки с делегатом
|
: Май 26, 2022, 16:24
|
Коллеги, столкнулся с неожиданной проблемой, когда потребовалось получить текстовое значение ячеек QTableView, в которых используются делегаты. Это мне потребовалось, чтобы организовать поиск в таблице. Понятно, что использовать модель, прицепленную к таблице, нельзя потому, что в ней содержится не то, что отображается в таблице. Я не нашел внятного решения, поэтому, думаю, кому-нибудь это может показаться полезным. Не привожу полного "компилябельного" примера, но идея должна быть понятна. Она проста - в самом делегате нужно предусмотреть открытый метод getItemText(const QModelIndex &index), который используется как для отрисовки делегата в таблице, так и при получении содержимого ячейки QTableView. Опуская детали, на примере делегата с использованием QComboBox: C++ (Qt) class ComboItem; class CComboDelegate : public QStyledItemDelegate { Q_OBJECT private: QList<ComboItem> items; // public: // QString getItemText(const QModelIndex &index) const; // QAbstractItemDelegate interface public: QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void setEditorData(QWidget *editor, const QModelIndex &index) const override; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; }; class ComboItem { public: QString item; QVariant data; ComboItem() = default; ComboItem(QString text, QVariant value) { item = text; data = value; } bool operator == (const ComboItem& other) const { return other.data == data; } };
Класс ComboItem содержит отображаемый текст и данные модели: C++ (Qt) QWidget *CComboDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { QComboBox* combo = new QComboBox(parent); combo->setEditable(false); combo->setAutoFillBackground(true); foreach (auto i, items) { combo->addItem(i.item, i.data); } return combo; } QString CComboDelegate::getItemText(const QModelIndex &index) const { int i = items.indexOf(ComboItem("",index.data())); return (i>=0)? items[i].item : index.data().toString(); } void CComboDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { Qt::ItemFlags flag = index.model()->flags(index); painter->save(); if (option.state & QStyle::State_HasFocus || (option.state & QStyle::State_Selected && option.state & QStyle::State_Active)) { painter->fillRect(option.rect, option.palette.highlight()); painter->setPen(option.palette.highlightedText().color()); } else if (option.state & QStyle::State_Selected) { painter->fillRect(option.rect, option.palette.color(QPalette::Inactive, QPalette::Highlight)); } else if((flag & Qt::ItemIsEditable) == false) { painter->fillRect(option.rect, QBrush(QColor(255, 245, 238))); } QRect rect = option.rect; rect.setX(rect.x()+3); painter->drawText(rect, Qt::AlignLeft | Qt::AlignVCenter, getItemText(index)); painter->restore(); } Из всего того, что я привел выше, существенно только то, что то, что делается в getItemText, все равно используется в CComboDelegate::paint, я его только выполнил в виде метода и сделал открытым. Кстати, попутно тут я привел код отрисовки делегата для разных случаев (фокуса, выбранного, неактивного, только для чтения) - тоже может быть полезным. Далее, как это используется при поиске по столбцу таблицы: C++ (Qt) void MainWindow::finderSlot(const QString &text) { if(!text.size()) return; bool find = false; QModelIndex index = tableViewData->currentIndex(); if(index.isValid()) { QAbstractItemDelegate* delegate = tableViewData->itemDelegateForColumn(index.column()); CComboDelegate* comboDelegate = qobject_cast<CComboDelegate*>(delegate); QAbstractItemModel* model = tableViewData->model(); for(int i=0; i<model->rowCount(); i++) { index = index.siblingAtRow(i); QString value = (comboDelegate)? comboDelegate->getItemText(index) : model->data(index).toString(); if(value.startsWith(text, Qt::CaseInsensitive)) { tableViewData->setCurrentIndex(index); find = true; break; } } } else { QMessageBox (QMessageBox::Warning, "Search", "The search field is not selected", QMessageBox::Ok).exec(); lineEditFind->clear(); } if(!find) QApplication::beep(); }
Если текст найден, то курсор перемещается на соответствующую ячейку.
|
|
|
95
|
Qt / Вопросы новичков / Re: QActions
|
: Май 10, 2022, 23:28
|
Почему нельзя просто дать ссылку на статью или сообщение?
Добро пожаловать на форум, самый беспощадный форум в мире
|
|
|
96
|
Qt / Вопросы новичков / Re: QActions
|
: Май 06, 2022, 20:36
|
Впредь не нужно цитировать каждое сообщение, тем более, что вы не используете его для ответа.
|
|
|
97
|
Qt / Вопросы новичков / Re: QActions
|
: Май 06, 2022, 19:33
|
Но примерно начинаю понимать. Получается, что для каждого QAction надо оформлять подписку от виджетов, на которые действие распространяется?
У вас в голове каша, уж извините)) Совсем наоборот, сигналы виджетов надо соединить со слотами, к примеру (я использую сигнал из вашего примера): C++ (Qt) MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { connect(textEdit1, &QPlainTextEdit::copyAvailable, this, &MainWindow::actionSlot); connect(textEdit2, &QPlainTextEdit::copyAvailable, this, &MainWindow::actionSlot); connect(textEdit3, &QPlainTextEdit::copyAvailable, this, &MainWindow::actionSlot); } void MainWindow::actionSlot() { QPlainTextEdit *edit = qobject_cast<QPlainTextEdit*>(sender()); bool len = edit->toPlainText().size(); copyAct->setEnabled(len > 100); }
Для другого типа виджета создаете другой слот, где анализируется другое условие. Ну и т.д. В чем громоздкость?
|
|
|
98
|
Qt / Вопросы новичков / Re: QActions
|
: Май 06, 2022, 18:21
|
Чувствую, что вы опять что-то скрываете К чему вы упомянули "qApp об изменении активного окна"? У вас MDI? Или нужно менять доступность меню от изменения фокуса виджета? Тогда слотом не обойтись - придется переопределять фильтр событий (installEventFilter, eventFilter). Но, возможно, достаточно просто проверить фокус виджета, который отправил сигнал. А так все верно. Но, поскольку исходные события разные (изменение текущего узла, изменение текста и т.д.), делайте на каждое событие свой слот, чтобы не строить громоздкую логику. Потом, не исключено, что-то можно будет упростить и объединить.
|
|
|
99
|
Qt / Вопросы новичков / Re: QActions
|
: Май 06, 2022, 16:41
|
А если виджет не знает, что за действия с ним хотят произвести? Например, у меня есть Action, который меняет регистр символов в текстовом поле. Как мне получить указание на его доступность/недоступность?
Для начала нужно самому себе сформулировать задачу, которую хотите решить К примеру, если у вас несколько источников событий (виджетов или других объектов), от которых зависит состояние QAction, то логично было бы создать слот, в котором эти события анализировались и устанавливалось состояние QAction. А соответствующие сигналы этих объектов соединить с этим слотом.
|
|
|
102
|
Разное / Новости Qt сообщества / Re: Доступ к Qt
|
: Март 09, 2022, 10:59
|
Чтобы просто скачать исходники, достаточно бесплатного KasperskyVPN Secure Connection. Безлимит у него примерно в 2 раза дешевле PIA. Правда, под виндой. Для Linuх, наверное, можно использовать виндовую тачку в качестве прокси, или я ошибаюсь?
|
|
|
103
|
Разное / Новости Qt сообщества / Доступ к Qt
|
: Март 07, 2022, 15:51
|
Коллеги, вчера еще был доступ к архивам исходных кодов Qt, а сегодня - ошибка 403. Что еще нам отрубили? Как думаете, PostgreSQL закроют и что делать, если это произойдет?
|
|
|
|
|