Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt按钮处理建议_C++_Qt_Qt4 - Fatal编程技术网

C++ Qt按钮处理建议

C++ Qt按钮处理建议,c++,qt,qt4,C++,Qt,Qt4,我已经厌倦了如何处理Qt中的用户输入(即QPushButtonpress),我正在寻找处理这些事件的最佳方法的建议 下面是我目前正在做的一个例子: MyClass.h class MyClass : public QMainWindow { Q_OBJECT public: ... QPushButton* getButtonA( ); QPushButton* getButtonB( ); public slots: void buttonAP

我已经厌倦了如何处理Qt中的用户输入(即
QPushButton
press),我正在寻找处理这些事件的最佳方法的建议

下面是我目前正在做的一个例子:

MyClass.h

class MyClass : public QMainWindow
{
    Q_OBJECT

public:

    ...

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

public slots:

    void buttonAPressed( );
    void buttonBPressed( );

private:

    ...

};
MyClass
{
...

public slots:
    void on_pushButtonStart_clicked();

...
};
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( );
}
MyClass::on_pushButtonStart_clicked()
{
    // code goes for pushButtonStart's clicked signal
}

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

您实际上使用的是处理Qt中按钮按下的标准方式。我知道的唯一其他方法是让
MyClass
成为按钮的事件过滤器,在这种情况下,这似乎有些过分

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

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

这会将连接排除在主方法之外,并将它们分组到它们应该在的位置,即在包含发出信号的按钮的类中。

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

但是,您可以进一步简化这种处理UI控件发出的信号插槽的技术。如果使用以下特定方式定义函数,则不需要上述
connect()
调用:

MyClass.h

class MyClass : public QMainWindow
{
    Q_OBJECT

public:

    ...

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

public slots:

    void buttonAPressed( );
    void buttonBPressed( );

private:

    ...

};
MyClass
{
...

public slots:
    void on_pushButtonStart_clicked();

...
};
MyClass.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( );
}
MyClass::on_pushButtonStart_clicked()
{
    // code goes for pushButtonStart's clicked signal
}
函数的名称必须非常具体:

  • 它必须在上以
    开头
  • 然后应该有控件的名称:
    pushButtonStart
  • 信号名称后面应该有一个下划线:
    \u clicked

  • Qt魔术。Qt自动连接
    pushButtonStart
    点击的
    信号与
    点击的
    插槽。您不需要单独指定连接。

    我总是忘记自动连接的事情,原因有两个。语法很难看:)直到Qt 4和我开始使用Qt 3时它才存在。@matt rogers:即使是中等规模的项目,它也很方便,因为构造函数中已经充满了
    connects()
    s,而且可能还有其他代码。我同意语法有点难看,但命名方案对我来说是有意义的。