C++ Qt按钮处理建议
我已经厌倦了如何处理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
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,而且可能还有其他代码。我同意语法有点难看,但命名方案对我来说是有意义的。