Советы по обработке кнопок Qt - PullRequest
2 голосов
/ 05 августа 2011

Я дошел до того, что мне надоело то, как я обрабатываю пользовательский ввод в Qt (а именно QPushButton нажатий), и я ищу совет относительно лучшего метода обработки этих событий.

Ниже приведен пример того, что я сейчас делаю:

MyClass.h

class MyClass : public QMainWindow
{
    Q_OBJECT

public:

    ...

    QPushButton* getButtonA( );
    QPushButton* getButtonB( );

public slots:

    void buttonAPressed( );
    void buttonBPressed( );

private:

    ...

};

main.cpp

int main( int argc, char* argv[ ] )
{
    QApplication a( argc, argv );
    MyClass w;

    w.show( );

    QObject::connect( w.getButtonA( ), SIGNAL( clicked( ) ), &w, SLOT( buttonAPressed( ) ) );
    QObject::connect( w.getButtonB( ), SIGNAL( clicked( ) ), &w, SLOT ( buttonBPressed( ) ) );

    return a.exec( );
}

Это прекрасно работает, но я просто чувствую, что должен быть лучший / более элегантный способ, чем этот, верно?

Ответы [ 2 ]

3 голосов
/ 05 августа 2011

Я предполагаю, что вы разрабатываете пользовательский интерфейс с помощью Designer.Предположим, у вас есть кнопка с именем pushButtonStart для вашего MyClass класса.Затем вы можете поместить соединения внутри конструктора MyClass как Мэтт Роджерс заявляет :

MyClass::MyClass()
{
    connect(ui->pushButtonStart, SIGNAL(clicked()), this, SLOT(startPressed());
}

Однако вы можете еще больше упростить эту технику обработки слотов для сигналов, излучаемых элементами управления пользовательского интерфейса.,Вышеуказанный вызов connect() не требуется, если вы определяете функцию следующим определенным образом:

MyClass.h

MyClass
{
...

public slots:
    void on_pushButtonStart_clicked();

...
};

MyClass.cpp

MyClass::on_pushButtonStart_clicked()
{
    // code goes for pushButtonStart's clicked signal
}

Имя функции должно быть очень конкретным:

  1. Оно должно начинаться с on_.
  2. Тогда должно бытьимя элемента управления: pushButtonStart.
  3. Там должно быть подчеркивание, за которым следует имя сигнала: _clicked.

Qt magic.Qt автоматически соединяет сигнал pushButtonStart clicked со слотом on_pushButtonStart_clicked.Вам не нужно указывать соединение отдельно.

3 голосов
/ 05 августа 2011

На самом деле вы используете стандартный способ обработки нажатий кнопок в Qt.Единственный другой способ, о котором я знаю, - это MyClass быть фильтром событий для кнопок, что в данном случае кажется чрезмерным.

Единственное изменение, которое я бы сделал в вашем коде, это поместитьсигнал -> слот соединения в самом MyClass.В этом примере я предполагаю, что вы хотите установить их в конструкторе, который будет выглядеть следующим образом:

MyClass::MyClass()
{
    QObject::connect( w.getButtonA( ), SIGNAL( clicked( ) ), &w, SLOT( buttonAPressed( ) ) );
    QObject::connect( w.getButtonB( ), SIGNAL( clicked( ) ), &w, SLOT( buttonBPressed( ) ) );
}

Это удерживает соединения вне основного метода и группирует их там, где они должны быть, который находится в классе, который содержит кнопки, которые испускают сигналы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...