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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 5 6 [7] 8 9 ... 58
91  Qt / Базы данных / Re: Работа с БД в отдельном потоке : Май 31, 2022, 09:09
Да хоть 40, какая разница? Массив указателей, в отдельном методе установка модели. Не понимаю проблемы. Но хозяин - барин...
92  Qt / Базы данных / Re: Работа с БД в отдельном потоке : Май 30, 2022, 22:00
Вы не поняли - я предлагаю использовать TableView из того потока, где вы работаете с базой. Т.е. в конструкторе вокера предусматриваете ссылку на вьюшник, ну и в конструкторе делаете tableView-> setModel(model618).
93  Qt / Базы данных / Re: Работа с БД в отдельном потоке : Май 30, 2022, 17:18
Может, сделать наоборот - в вокер передать ссылку на TableView? Проблем с совместным использованием, вроде, не наблюдается.
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. А соответствующие сигналы этих объектов соединить с этим слотом.

100  Qt / Кладовая готовых решений / Re: Круги в таблице QTableWidget, имитация графики : Май 06, 2022, 12:48
Угу. А через N лет либо форум накроется
...
Он уже накрылся, после того как здесь появился зероинтеллект.
101  Qt / Общие вопросы / Re: Индикатор "Drawing Objects" : Апрель 05, 2022, 20:38
Может, QApplication::processEvents() ?
102  Разное / Новости Qt сообщества / Re: Доступ к Qt : Март 09, 2022, 10:59
Чтобы просто скачать исходники, достаточно бесплатного KasperskyVPN Secure Connection. Безлимит у него примерно в 2 раза дешевле PIA. Правда, под виндой. Для Linuх, наверное, можно использовать виндовую тачку в качестве прокси, или я ошибаюсь?
103  Разное / Новости Qt сообщества / Доступ к Qt : Март 07, 2022, 15:51
Коллеги,
вчера еще был доступ к архивам исходных кодов Qt, а сегодня - ошибка 403.
Что еще нам отрубили? Как думаете, PostgreSQL закроют и что делать, если это произойдет?
104  Qt / Model-View (MV) / Re: Задать данные для пользовательской роли (Qt::UserRole) : Январь 31, 2022, 15:57
Понял, спасибо!
105  Qt / Model-View (MV) / Re: Задать данные для пользовательской роли (Qt::UserRole) : Январь 31, 2022, 15:16
а ты куда-то сохраняешь данные для пользовательской роли (по коду не видно)? по волшебству они нигде не хранятся, ну и в data() надо возвращать значения для своих ролей.
Это вот так нужно делать? В замешательстве Да никуда не сохраняю, соответственно и не возвращаю... Меня сбил с толку этот пример: https://question-it.com/questions/1695492/kak-dobavit-raznye-tipy-delegatov-v-qtreeview.
Понятно. Тогда, для моей задачи проще в CComboDelegate добавить параметром этот тип и не париться с левыми ролями.
Страниц: 1 ... 5 6 [7] 8 9 ... 58

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