Qt按钮处理建议

Qt Button Handling Advice

本文关键字:处理 按钮 Qt      更新时间:2023-10-16

我已经到了我厌倦了如何在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( );
}

它工作得很好,但我只是觉得一定有比这更好/更优雅的方式,对吗?

我猜你正在用Designer设计UI。假设您的MyClass类有一个名为pushButtonStart的按钮。然后,您可以将连接放置在MyClass的构造函数中,如Matt Rogers所述:

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

但是,您可以进一步简化这种处理UI控件发出的信号的技术。如果您使用以下特定方式定义函数,则不需要上述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魔法。Qt自动将pushButtonStartclicked信号与on_pushButtonStart_clicked插槽连接。您不需要单独指定连接

您实际上使用的是Qt中处理按钮按下的标准方式。我所知道的唯一另一种方式是通过将MyClass作为按钮的事件过滤器,在这种情况下,这似乎是多余的。

我对你的代码所做的唯一改变是将信号->插槽连接放在MyClass本身。在本例中,我假设您希望在构造函数中设置它们,如下所示:

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

这将使连接远离主方法,并将它们分组在它们应该在的地方,这是在包含发出信号的按钮的类中。