我正在尝试制作一个小 gui 来在我的本地 glassfish 安装上部署 .ear 和 .war 文件。所以我做了五行,其中包含一个文件名字段、一个复选框和一个按钮来调出一个文件对话框来定位 war/ear 文件。最好让所有按钮调用相同的函数,并从函数中找出五个按钮中的哪一个进行调用(以更新正确的文本字段)。不知道这是否是以面向对象的方式进行的预期方式,但我唯一的 gui 编程经验是一些旧的 win16 事件循环:)。
//BRG安德斯奥尔梅
我正在尝试制作一个小 gui 来在我的本地 glassfish 安装上部署 .ear 和 .war 文件。所以我做了五行,其中包含一个文件名字段、一个复选框和一个按钮来调出一个文件对话框来定位 war/ear 文件。最好让所有按钮调用相同的函数,并从函数中找出五个按钮中的哪一个进行调用(以更新正确的文本字段)。不知道这是否是以面向对象的方式进行的预期方式,但我唯一的 gui 编程经验是一些旧的 win16 事件循环:)。
//BRG安德斯奥尔梅
QPushButton *buttonA = new QPushButton("A");
QPushButton *buttonB = new QPushButton("B");
QPushButton *buttonC = new QPushButton("C");
buttonA->setObjectName("A");
buttonB->setObjectName("B");
buttonC->setObjectName("C");
connect(buttonA, SIGNAL(clicked()), this, SLOT(testSlot()));
connect(buttonB, SIGNAL(clicked()), this, SLOT(testSlot()));
connect(buttonC, SIGNAL(clicked()), this, SLOT(testSlot()));
//Now in slot implementation
void QWidget::testSlot()
{
QObject *senderObj = sender(); // This will give Sender object
// This will give obejct name for above it will give "A", "B", "C"
QString senderObjName = senderObj->objectName();
if(senderObjName == "A")
{
//Implement Button A Specific
}
//Similarly for "B" and "C"
if(senderObjName == "B")
{
//Implement Button B Specific
}
if(senderObjName == "C")
{
//Implement Button C Specific
}
}
我已经使用这种方法来实现这种情况,因为代码更具可读性,但随着字符串比较的到来,它可能会很耗时。谢谢!
将每个按钮的click()
信号与同一个插槽连接,并QObject * QObject::sender () const [protected]
在此插槽中使用以找出哪个按钮发送了信号(被点击)。或者,您可以使用QSignalMapper
专门为此类任务制作的特殊类。