Russian Qt Forum
Ноябрь 25, 2024, 11:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QComboBox LostFocus  (Прочитано 3228 раз)
virtual_root
Гость
« : Сентябрь 18, 2012, 13:54 »

Добрый день. Уже пол дня пытаюсь добиться для своего combobox сигнала о потере фокуса. Я создала свой класс наследник от QComboBox, где переопределяю метод focusOutEvent(QFocusEvent *e), и в нем посылаю сигнал о потери фокуса моим виджетом. Но вот не задача, сигнал приходит даже если я нажимаю на кнопку в combobox чтобы выпал список его итемов... Уже перепробовала кучу способов, но что-то не удается победить проблему.. Ребята, подскажите, пожалуйста решение!
Привожу свой код:
Код
C++ (Qt)
#ifndef PQCOMBOBOX_H
#define PQCOMBOBOX_H
 
#include <QComboBox>
 
class PQComboBox : public QComboBox
{
   Q_OBJECT
public:
   explicit PQComboBox(QWidget *parent = 0);
protected:
   void focusOutEvent(QFocusEvent *e);
 
signals:
   void LostFocus();
 
public slots:
 
};
 
#endif // PQCOMBOBOX_H
 

Код
C++ (Qt)
#include <QFocusEvent>
#include <QCursor>
#include <QDebug>
#include "pqcombobox.h"
 
PQComboBox::PQComboBox(QWidget *parent) :
   QComboBox(parent)
{
}
 
void PQComboBox::focusOutEvent(QFocusEvent *e){
   if (!this->geometry().contains(QCursor::pos())){
       qDebug()<<"ytyt";
   }
 
 
}
 
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Сентябрь 18, 2012, 14:47 »

Но вот не задача, сигнал приходит даже если я нажимаю на кнопку в combobox чтобы выпал список его итемов...
Да, приходит, т.к. фокус в этом случае переходит к другому виджету. Всё правильно.
Чтобы это отследить перегрузи QComboBox::showPopup() и QComboBox::hidePopup(),  в которых выставляй и сбрасывай какой-либо флаг.
Поправочка: не сигнал, а событие.

Кстати, не мешало бы в перегруженном focusOutEvent() вызывать метод базового класса.
« Последнее редактирование: Сентябрь 18, 2012, 14:57 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
virtual_root
Гость
« Ответ #2 : Сентябрь 18, 2012, 15:39 »

спасибо, попробую.
Записан
virtual_root
Гость
« Ответ #3 : Сентябрь 18, 2012, 18:38 »

У меня ещё вопрос появился. Помогите пожалуйста. Как сделать чтобы форма наследованная от QScrollArea скролировала саму себя?
Я эту форму отображаю внутри QWidget другой формы. Полностью форма в QWidget  не влазиет, и мне нужно чтобы она могла прокручивать своё содержимое. Ну что-то ни как не получается сладить с ней...
вот код:
Код
C++ (Qt)
#ifndef EDITCONTACT_H
#define EDITCONTACT_H
 
#include <QScrollArea>
#include "pqsqlite.h"
 
namespace Ui {
class EditContact;
}
 
class EditContact : public QScrollArea
{
   Q_OBJECT
 
public:
   explicit EditContact(QWidget *parent = 0);
   ~EditContact();
   void ViewContact(QHash<QString,QVariant> data);
private:
   PQSQLite *_db;
   int _contactID;
   void _showChildren();
   void _showNotes();
 
private slots:
   void on_comboBox_LostFocus();
 
   /** @brief метод вызывается при клике по полю имя,отчество
     */

   void on_lineEditName_clicked();
 
   /** @brief метод вызывается при потере фокуса у поля имя,отчество
     */

   void on_lineEditName_lostFocus();
 
   /** @brief метод вызывается при потере фокуса у поля фамилия
     */

   void on_lineEditLastName_lostFocus();
 
   /** @brief метод вызывается при клике по полю  фамилия
     */

   void on_lineEditLastName_clicked();
 
   /** @brief метод вызывается при потере фокуса у поля email
     */

   void on_lineEditEmail_lostFocus();
 
   /** @brief метод вызывается при клике по полю email
     */

   void on_lineEditEmail_clicked();
 
   /** @brief метод вызывается при потере фокуса у поля мобильный
     */

   void on_lineEditMobile_lostFocus();
 
   /** @brief метод вызывается при клике по полю мобильный
     */

   void on_lineEditMobile_clicked();
 
   /** @brief метод вызывается при потере фокуса у поля компания
     */

   void on_lineEditCompany_lostFocus();
 
   /** @brief метод вызывается при клике по полю компания
     */

   void on_lineEditCompany_clicked();
 
   /** @brief метод вызывается при потере фокуса у поля домашний
     */

   void on_lineEditHomePhone_lostFocus();
 
   /** @brief метод вызывается при клике по полю компания
     */

   void on_lineEditHomePhone_clicked();
 
 
private:
   Ui::EditContact *ui;
};
 
#endif // EDITCONTACT_H
 

Код
C++ (Qt)
#include <QFont>
#include "editcontact.h"
#include "ui_editcontact.h"
 
EditContact::EditContact(QWidget *parent) :
   QScrollArea(parent),
   ui(new Ui::EditContact)
{
   ui->setupUi(this);
 
   /// инициализируем свойства класса
   _db = PQSQLite::GetInstance();
 
   /// трюки с combobox
   ui->labelCategory->hide();
   ui->comboBox->addItem("gdfgsffg");
 
   /// настроим некоторые виджеты
   ui->lineEditMobile->setInputMask("+7 (999) 999-9999");
   ui->lineEditHomePhone->setInputMask("2-99-99-99");
 
   ui->tableWidgetChildren->setColumnCount(3);
   ui->tableWidgetNotes->setColumnCount(3);
   ui->tableWidgetChildren->hideColumn(0);
   ui->tableWidgetNotes->hideColumn(0);
}
 
EditContact::~EditContact()
{
   delete ui;
}
 
/// метод заполняющий форму данными полученного контакта
void EditContact::ViewContact(QHash<QString, QVariant> data){
 
   _contactID = data["ID"].toInt();
 
   ui->lineEditName->setText(data.value("name").toString());
   ui->lineEditLastName->setText(data.value("lastName").toString());
   ui->dateEditDay->setDate(data.value("birthday").toDate());
   ui->lineEditEmail->setText(data.value("email").toString());
   ui->lineEditCompany->setText(data.value("company").toString());
   ui->lineEditHomePhone->setText(data.value("homePhone").toString());
   ui->lineEditMobile->setText(data.value("mobile").toString());
 
   this->_showChildren();
   this->_showNotes();
 
   if (!this->isVisible()) this->show();
}
 
void EditContact::_showChildren(){
 
   QList<QHash<QString,QVariant> > list;
   _db->selectFilter("children","contactID="+QString::number(_contactID),&list);
 
   ui->tableWidgetChildren->clear();
   ui->tableWidgetChildren->setRowCount(0);
 
   int count = list.count();
   for (int i=0; i<count; i++){
       int row = ui->tableWidgetChildren->rowCount() + 1;
       ui->tableWidgetChildren->setRowCount(row);
       QHash<QString,QVariant> record = list.at(i);
 
       QTableWidgetItem *itemID = new QTableWidgetItem(record.value("ID").toString());
       ui->tableWidgetChildren->setItem(row-1,0,itemID);
 
       QTableWidgetItem *itemName = new QTableWidgetItem(record.value("name").toString());
       ui->tableWidgetChildren->setItem(row-1,1,itemName);
 
       QTableWidgetItem *itemDay = new QTableWidgetItem(record.value("birthday").toString());
       ui->tableWidgetChildren->setItem(row-1,2,itemDay);
 
   }
   ui->tableWidgetChildren->resizeRowsToContents();
   ui->tableWidgetChildren->resizeColumnsToContents();
}
 
void EditContact::_showNotes(){
 
   QList<QHash<QString,QVariant> > list;
   _db->selectFilter("notesContact","contactID="+QString::number(_contactID),&list);
 
   ui->tableWidgetNotes->clear();
   ui->tableWidgetNotes->setRowCount(0);
 
   int count = list.count();
   for (int i=0; i<count; i++){
       int row = ui->tableWidgetNotes->rowCount() + 1;
       ui->tableWidgetNotes->setRowCount(row);
       QHash<QString,QVariant> record = list.at(i);
 
       QTableWidgetItem *itemID = new QTableWidgetItem(record.value("ID").toString());
       ui->tableWidgetNotes->setItem(row-1,0,itemID);
 
       QTableWidgetItem *itemTitle = new QTableWidgetItem(record.value("titleInform").toString());
       QFont  font("Times" , 9 , QFont ::Bold );
           QBrush  color (Qt::red);
           itemTitle->setForeground(color);
           itemTitle->setFont(font);
       ui->tableWidgetNotes->setItem(row-1,1,itemTitle);
 
       QTableWidgetItem *itemInform = new QTableWidgetItem(record.value("inform").toString());
       ui->tableWidgetNotes->setItem(row-1,2,itemInform);
 
       /// растянем расстояние между таблицей и последующими за ней элементами
       ui->tableWidgetNotes->setRowHeight(row,20);
       ui->pushButtonDelContact->setGeometry(ui->pushButtonDelContact->x(),ui->pushButtonDelContact->y()+20,ui->pushButtonDelContact->width(),ui->pushButtonDelContact->height());
       ui->widget->setGeometry(ui->widget->x(),ui->widget->y()+20,ui->widget->width(),ui->widget->height());
       ui->tableWidgetNotes->setGeometry(ui->tableWidgetNotes->x(), ui->tableWidgetNotes->y(),ui->tableWidgetNotes->width(),ui->tableWidgetNotes->height()+20);
   }
   ui->tableWidgetNotes->resizeRowsToContents();
   ui->tableWidgetNotes->resizeColumnsToContents();
}
 
void EditContact::on_comboBox_LostFocus()
{
   ui->comboBox->hide();
}
 
/// обрабатываем собития клика и потери фокуса для поля имя,отчество
void EditContact::on_lineEditName_lostFocus()
{
   ui->lineEditName->setStyleSheet("background-color: rgba(255, 255, 255, 0);");
   ui->lineEditName->setFrame(false);
   ui->lineEditName->setReadOnly(true);
 
   if (!ui->lineEditName->text().isEmpty())
       _db->UpdateOneField("contacts","name",ui->lineEditName->text(),"ID="+QString::number(_contactID));
}
 
void EditContact::on_lineEditName_clicked()
{
    ui->lineEditName->setStyleSheet("background-color: rgba(255, 255, 255, 255);");
    ui->lineEditName->setFrame(true);
    ui->lineEditName->setReadOnly(false);
}
/// обрабатываем собития клика и потери фокуса для поля фамилия
void EditContact::on_lineEditLastName_lostFocus()
{
   ui->lineEditLastName->setStyleSheet("background-color: rgba(255, 255, 255, 0);");
   ui->lineEditLastName->setFrame(false);
 
   if (!ui->lineEditLastName->text().isEmpty())
       _db->UpdateOneField("contacts","lastName",ui->lineEditLastName->text(),"ID="+QString::number(_contactID));
}
 
void EditContact::on_lineEditLastName_clicked()
{
    ui->lineEditLastName->setStyleSheet("background-color: rgba(255, 255, 255, 255);");
    ui->lineEditLastName->setFrame(true);
    ui->lineEditLastName->setReadOnly(false);
}
 
/// обрабатываем собития клика и потери фокуса для поля email
void EditContact::on_lineEditEmail_lostFocus()
{
   ui->lineEditEmail->setStyleSheet("background-color: rgba(255, 255, 255, 0);");
   ui->lineEditEmail->setFrame(false);
   ui->lineEditEmail->setReadOnly(true);
 
   if (!ui->lineEditEmail->text().isEmpty())
       _db->UpdateOneField("contacts","email",ui->lineEditEmail->text(),"ID="+QString::number(_contactID));
}
 
void EditContact::on_lineEditEmail_clicked()
{
    ui->lineEditEmail->setStyleSheet("background-color: rgba(255, 255, 255, 255);");
    ui->lineEditEmail->setFrame(true);
    ui->lineEditEmail->setReadOnly(false);
}
 
/// обрабатываем собития клика и потери фокуса для поля мобильный
void EditContact::on_lineEditMobile_lostFocus()
{
   ui->lineEditMobile->setStyleSheet("background-color: rgba(255, 255, 255, 0);");
   ui->lineEditMobile->setFrame(false);
   ui->lineEditMobile->setReadOnly(true);
 
   if (!ui->lineEditMobile->text().isEmpty())
       _db->UpdateOneField("contacts","mobile",ui->lineEditMobile->text(),"ID="+QString::number(_contactID));
}
 
void EditContact::on_lineEditMobile_clicked()
{
    ui->lineEditMobile->setStyleSheet("background-color: rgba(255, 255, 255, 255);");
    ui->lineEditMobile->setFrame(true);
}
 
/// обрабатываем собития клика и потери фокуса для поля компания
void EditContact::on_lineEditCompany_lostFocus()
{
   ui->lineEditCompany->setStyleSheet("background-color: rgba(255, 255, 255, 0);");
   ui->lineEditCompany->setFrame(false);
   ui->lineEditCompany->setReadOnly(true);
 
   if (!ui->lineEditCompany->text().isEmpty())
       _db->UpdateOneField("contacts","company",ui->lineEditCompany->text(),"ID="+QString::number(_contactID));
}
 
void EditContact::on_lineEditCompany_clicked()
{
    ui->lineEditCompany->setStyleSheet("background-color: rgba(255, 255, 255, 255);");
    ui->lineEditCompany->setFrame(true);
    ui->lineEditCompany->setReadOnly(false);
}
/// обрабатываем собития клика и потери фокуса для поля Домашний
void EditContact::on_lineEditHomePhone_lostFocus()
{
   ui->lineEditHomePhone->setStyleSheet("background-color: rgba(255, 255, 255, 0);");
   ui->lineEditHomePhone->setFrame(false);
   ui->lineEditHomePhone->setReadOnly(true);
 
   if (!ui->lineEditHomePhone->text().isEmpty())
       _db->UpdateOneField("contacts","homePhone",ui->lineEditHomePhone->text(),"ID="+QString::number(_contactID));
}
 
void EditContact::on_lineEditHomePhone_clicked()
{
    ui->lineEditHomePhone->setStyleSheet("background-color: rgba(255, 255, 255, 255);");
    ui->lineEditHomePhone->setFrame(true);
    ui->lineEditHomePhone->setReadOnly(false);
}
 
вот вызываю в другой форме:
Код:
    /// отображение данных по контакту
    _viewContact = new EditContact(ui->widget_2);
    _viewContact->show();
Записан
virtual_root
Гость
« Ответ #4 : Октябрь 06, 2012, 13:57 »

спасибо большое! с combobox всё получилось!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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