Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Пытон от Января 14, 2012, 10:06



Название: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Пытон от Января 14, 2012, 10:06
Форма создана в QtDesigner. Загружена посредством модуля uic. Как мне теперь добраться до виджетов на этой форме? Как мне узнать, что, допустим, в каком-нибудь QListWidget пользователь нажал на клавишу "вниз" и обработать сие замечательное событие? Куды я должен впихнуть def event(self, e)?


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: mutineer от Января 14, 2012, 11:01
До виджетов добраться просто - myform.myWidget
event надо засовывать в виджет, ивенты которого хочешь обрабатывать. Ну или сигналы/слоты))


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Пытон от Января 14, 2012, 12:44
Как я засуну event в виджет, если я не создавал его код в своей программе? Не писал никакой свой класс основанный на каком-нибудь виджете.

Если советом будет: "так напиши" - то зачем нужен тогда дизайнер форм?


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: kambala от Января 14, 2012, 12:54
Если советом будет: "так напиши" - то зачем нужен тогда дизайнер форм?
чтобы наглядно создавать форму, а не писать её ручками. а вот логику ты ж не опишешь в дизайнере :)


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: mutineer от Января 14, 2012, 12:59
Как я засуну event в виджет, если я не создавал его код в своей программе?

Подпишись на нужные сигналы интересующих тебя виджетов


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Пытон от Января 14, 2012, 14:18
Цитировать
Подпишись на нужные сигналы интересующих тебя виджетов

Это как - подпишись?
Вдобавок, какой сигнал, допустим у QListWidget, позволит определить, что пользователь нажал на клавиатуре клавишу "А"?

Насколько я в курсе, подобное можно определить, только переопределяя функции в классах.


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Bepec от Января 14, 2012, 14:22
Пытон. Есть такая там функция Promote to...

Для переопределения функции нажатия класса, нужно полминуты времени ;) Или 15 минут чтения документации.


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: mutineer от Января 14, 2012, 15:41
Это как - подпишись?

Подпишись - это QObject::connect()
В питонах, вероятно, это QtCore.QObject.connect()


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: kambala от Января 14, 2012, 15:49
ну вообще-то для отлавливания нажатий клавиш надо не на сигнал подписываться, а переопределять метод keyPressEvent()


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Пытон от Января 14, 2012, 15:59
ну вообще-то для отлавливания нажатий клавиш надо не на сигнал подписываться, а переопределять метод keyPressEvent()

Ну, дык, подскажите кто-нибудь мне болезному, как я его переопределю-то???


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Пытон от Января 14, 2012, 16:03
Пытон. Есть такая там функция Promote to...

Для переопределения функции нажатия класса, нужно полминуты времени ;) Или 15 минут чтения документации.

Насколько я понял, сие есть создание нового виджета для использования в QtDesigner'e. Чтоб можно было его там мышкой на форму налепить.

Да не нужно мне это в данный момент. Мне нужно определить нажатие на клавишу "А", в стандартном виджете QtListWidget, который я налепил на форму в дизайнере, но в своей программе ОЧЕНЬ хочу узнать про клавишу "А" в этом чёртовом виджете.


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Пытон от Января 14, 2012, 16:10
Код
Python
myform = uic.loadUi("form.ui")
 
modify class myform.myQListWidget:
   def keyPressEvent(self, e):
       print (e.text())
 

Во чего хочу.
modify я, естественно, придумал. Но очень хочется чтобы она такая была...


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: kambala от Января 14, 2012, 16:18
ну так я ж не специалист по питону, недавно только туториал на оф. сайте прочёл :) но основная идея такая: создать класс-наследник QListWidget, в нём переопределить метод keyPressEvent, а там написать (не гарантирую корректность синтаксиса)
Код
Python
if e.key() == Qt.Key_A:
   # делаешь что тебе нужно
else:
   super.keyPressEvent(self, e)
а в дизайнере промоутнуть QListWidget на своей форме до вот этого класса


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Пытон от Января 14, 2012, 16:29
Я в курсе как сделать обработку нажатия на клавишу в собственном классе-наследнике. Если я сам, ручками, написал класс-наследник я без проблем определю ему функцию-обработчик нажатия на клавишу; но я такой вот редиска и нехороший человек решил этот разнесчастный виджет налепить на форму в дизайнере.

На кой нужен дизайнер, если я не могу потом спокойно воспользоваться всеми возможностями виджетов на форме??? Не могу никакому виджету переопределить методы? Получается, для того, чтобы просто узнать о нажатии на клавишу в листвиджете, я сперва должен создать свой класс в отдельной python-программе, затем засунуть его в дизайнер, там налепить свой класс-виджет на форму, сохранить, загрузить ui-файл в форму в своей другой python-программе, а если понадобиться что-то подкорректировать в методе провести всю эту чудесную процедуру заново и охренеть, простите...


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: mutineer от Января 14, 2012, 16:36
Дизайнер нужен, чтобы быстро набросать простой интрефейс. Он не дает и не может дать всех возможностей, которые можно сделать кодом


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Bepec от Января 14, 2012, 18:16
Пытон, ты читаешь между строк.

Тебе нужно:
1. поставить стандартный (стандартный) виджет на форму.
2. потом создать 1 файл, в котором ты создашь класс - наследник от QListWidget(или любого другого виджета)
3. в этом файле переопределяешь 1 функцию (keyPressReleased к примеру)
4. далее, в Designer'e щелкаешь на виджете - Promote to...
5. пишешь там название своего файла.
6. запускаешь и радуешься тому, что твой QListWidget перехватывает отжатия клавиш.

PS ты ручками много напишешь, а вот если нужно будет сделать как надо дизайнеру, ты укопечёшься кодом переписывать. А так дал ему ui, пусть тягает как хочет. Хоть туда, хоть обратно, но программа у тебя меняться не будет никоим образом.


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Пытон от Января 14, 2012, 19:24
Эдак у меня будет два py-файла вместо одного. При редактировании программы оба файла нужно будет держать открытыми.
Попробую завтре. Поглядим насколько это удобно...  :-\


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Bepec от Января 14, 2012, 20:21
Понимаешь, в коде создавать все виджеты это хорошо.
Но как только начнётся - сдвинь на 2 мм вправо один, второй расширь на ... ммм, вот столько *показывает пальцами*, а потом покажи мне я ещё что нить скажу :)
Это норм, если прога твоя без дизайнера или маркетолога разрабатывается. А вот у мну на каждую поправку служебку приносят :D Я её оприходываю, добавляю изменения(две цифры), составляю ответ на служебку, отправляю. А если понравится на данный момент, то всё это нужно оформлять в архив :D
А через пару дней, когда новую версию посмотрят наконец, всё заного, только мм в другую сторону :D

Гораздо проще пригласить к себе маркетолога на часик ^^ И за 10 минут всё переделать, без изменения исходного кода и дооолгих компиляций.


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Пытон от Января 14, 2012, 21:54
Я программист-любитель, и хоть мои программы и используются в реальной работе, меня такие ужасы не касаются.  :o

Насчёт "в коде создавать все виджеты - это хорошо". Дык я и хочу их создавать не в коде, а в дизайнере, а в коде лишь подпиливать их напильничком: методы им переопределять. Да только вон тут (в Qt) какие заковырки. Которые завтра буду опробовать...


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Пытон от Января 14, 2012, 21:56
Кстати, питон - интерпретируемый язык - никакие долгие компиляции мне не страшны [дразнится]  ;)


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: mutineer от Января 14, 2012, 22:10
Да только вон тут (в Qt) какие заковырки. Которые завтра буду опробовать...

Ну, справедливости ради, это заковыки не в Qt, а в ООП


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Bepec от Января 14, 2012, 22:19
Пытон, будет у тебя проект строчек эдак на 250,000 тогда поймёшь что такое долгая компиляция :D


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Пытон от Января 14, 2012, 22:44
Пытон, будет у тебя проект строчек эдак на 250,000 тогда поймёшь что такое долгая компиляция :D

Ты в курсе что такое "интерпретируемый язык"? Он не компилируется, он интерпретируется.


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Bepec от Января 14, 2012, 23:07
покомандное выполнение программы интерпретатором без предварительной компиляции, «на лету»; обычно такой процесс медленнее работы предварительно скомпилированного кода, но для небольших программ, не требуя затрат времени на компиляцию, может повышать общую производительность.

В принципе основу я знал :) Теперь просветился точнее... к сожалению в проекте на 250000 строк быстродействие... как бы желательно.


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: andrew.k от Января 15, 2012, 00:41
Я не дочитал эту демагогию до конца, но по-моему то что ты хочешь получить даст тебе использование eventFilter.
Добавь для нужного виджета (QListWidget) eventFilter
И тогда не нужно будет ничего промоутить и красивее будет.


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: mutineer от Января 15, 2012, 01:02
Разве можно поставить фильтр на уже готовый виджет? вроде он в наследнике аппликейшена пишется


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: andrew.k от Января 15, 2012, 01:11
Разве можно поставить фильтр на уже готовый виджет? вроде он в наследнике аппликейшена пишется
можно.
фильтр можно поставить на любой виджет, на который у тебя есть указатель.
Открой ассистент.
Код
C++ (Qt)
void QObject::installEventFilter ( QObject * filterObj )


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: mutineer от Января 15, 2012, 01:14
блин, не нашел, потому что искал у QWidget. не думал что оно аж из объекта тянется


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Пытон от Января 15, 2012, 11:43
Код
Python
from PyQt4 import QtGui, QtCore, uic
import sys
 
# создаём класс-фильтр для обработчиков событий
class LEFilter(QtCore.QObject):
   def __init__(self, id, parent = None):
       QtCore.QObject.__init__(self, parent)
       self.id = id
   def eventFilter(self, obj, e):
       if e.type() == QtCore.QEvent.KeyPress:
           if e.text() != "1": form1.label.setText(form1.label.text() + e.text())
           else: form1.label.setText("")
       return QtCore.QObject.eventFilter(self, obj, e)
 
if __name__ == "__main__":
   app = QtGui.QApplication(sys.argv)
   form1 = uic.loadUi("ui_forms\QtDesigner_and_eventFilter.ui")
   # назначаем (инсталлируем) фильтр событий для виджета из формы QDesigner
   form1.lineEdit.installEventFilter(LEFilter(1, form1.lineEdit))
   form1.show()
   sys.exit(app.exec_())
 

Вот так выглядит такая кака как eventFilter в питоне.
Высмотрел пример в одном листинге, но он был без пояснений.
Подскажите, что за id принимает класс-фильтр? В том листинге строка с installEventFilter была продублирована дважды, отличаясь только номерами id (1 и 2 соответственно). Это зачем?
А также: кому и чего возвращает return?


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: mutineer от Января 15, 2012, 13:01
Цитировать
The eventFilter() function must return true if the event should be filtered, (i.e. stopped); otherwise it must return false.
То есть возвращается результат фильтрования (надо ли продолжать обработку события). В данном случае возвращается результат фильтр по умолчанию.

Что за id хз, видимо что-то специфическое для примера


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: interv от Января 16, 2012, 12:25
Код:
#ifndef MyListWidget_H
#define MyListWidget_H

#include <QListWidget>
#include <QKeyEvent>
#include <QDebug>

class MyListWidget : public QListWidget
{
    Q_OBJECT
public:
    explicit MyListWidget(QWidget *parent = 0):
    QListWidget(parent)
{
}

public slots:
  void MyPressed(QKeyEvent *event);

protected:
  void keyPressEvent(QKeyEvent *event)
  {
    if (event->key() == Qt::Key_A)
      qDebug()<<"Абра кадабра";
    //Или
    emit MyPressed(event);
  }

};

#endif // MyListWidget_H

На дизайнере форме:
РайтКлик на листвьюве -> Преобразованные виджеты -> Дальше если ты не в танке то разберешся


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Пытон от Января 22, 2012, 18:07
Я в танке, ибо пишу на питоне и в Сях ни в зуб ногой.


Название: Re: myform = uic.loadUi("uifile.ui"). А как теперь обрабатывать нажатия на клавиши?
Отправлено: Bepec от Января 26, 2012, 20:25
Если ты в танке, тогда закрывай смотровую щель и выжимай газ.

Тебе люди уже объяснили раза по 3, что надо делать, а ты даж ухи не почистил :)