您的 ButtonItem
类定义了一些基本的组件和信号,但是存在一些问题需要修正,特别是在初始化按钮和连接信号时。下面是一个更完整和正确的实现示例:
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
class ButtonItem : public QWidget {
Q_OBJECT
public:
QPushButton *left_btn;
QPushButton *right_btn;
ButtonItem(int item_type, QWidget *parent = nullptr) : QWidget(parent) {
// 初始化按钮
left_btn = new QPushButton("Left Button", this);
right_btn = new QPushButton("Right Button", this);
// 布局管理器
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(left_btn);
layout->addWidget(right_btn);
// 连接按钮的点击信号到自定义信号
connect(left_btn, &QPushButton::clicked, this, [this]() {
emit leftButtonClicked(left_btn); // 发出左侧按钮点击信号
});
connect(right_btn, &QPushButton::clicked, this, [this]() {
emit rightButtonClicked(right_btn); // 发出右侧按钮点击信号
});
}
signals:
void leftButtonClicked(QPushButton* left_btn); // 定义左侧按钮点击信号
void rightButtonClicked(QPushButton* right_btn); // 定义右侧按钮点击信号
};
改进点:
- 创建按钮: 在构造函数中,我添加了对
left_btn
和right_btn
的初始化,确保它们是有效的对象。 - 布局管理: 使用
QVBoxLayout
来管理这两个按钮的位置,使它们在窗口中垂直排列。 - lambda 表达式: 信号连接部分保持不变,但省略了多余的参数捕获,这样简化了代码。
使用这个类:
当您创建一个 ButtonItem
对象时,它将自动生成两个按钮并设置好相应的信号与槽。在其他地方,您可以通过连接这些自定义信号来响应按钮事件,例如:
// 示例使用方式
ButtonItem *buttonItem = new ButtonItem(0);
connect(buttonItem, &ButtonItem::leftButtonClicked, [](QPushButton* btn){
qDebug() << "Left button clicked!";
});
connect(buttonItem, &ButtonItem::rightButtonClicked, [](QPushButton* btn){
qDebug() << "Right button clicked!";
});
这样,当用户点击任意一个按钮时,将会发射对应的信号,并执行相应的槽函数。请根据需要进行进一步调整!如果有任何疑问或进一步的问题,请随时询问。
内容由零声教学AI助手提供,问题来源于学员提问