Название: QComboBox LostFocus
Отправлено: 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"; } }
Название: Re: QComboBox LostFocus
Отправлено: GreatSnake от Сентябрь 18, 2012, 14:47
Но вот не задача, сигнал приходит даже если я нажимаю на кнопку в combobox чтобы выпал список его итемов...
Да, приходит, т.к. фокус в этом случае переходит к другому виджету. Всё правильно. Чтобы это отследить перегрузи QComboBox::showPopup() и QComboBox::hidePopup(), в которых выставляй и сбрасывай какой-либо флаг. Поправочка: не сигнал, а событие. Кстати, не мешало бы в перегруженном focusOutEvent() вызывать метод базового класса.
Название: Re: QComboBox LostFocus
Отправлено: virtual_root от Сентябрь 18, 2012, 15:39
спасибо, попробую.
Название: Re: QComboBox LostFocus
Отправлено: virtual_root от Сентябрь 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();
Название: Re: QComboBox LostFocus
Отправлено: virtual_root от Октябрь 06, 2012, 13:57
спасибо большое! с combobox всё получилось!
|