在 Qt 中,带参数的信号和槽机制允许你在信号发射时传递信息给槽函数。下面是一个使用 QTreeWidget
和三个按钮的示例,其中按钮点击会触发带参数的槽。
示例代码
#include <QApplication>
#include <QWidget>
#include <QTreeWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QString>
#include <QObject>
#include <QMessageBox>
class MyWindow : public QWidget {
Q_OBJECT
public:
MyWindow() {
QVBoxLayout *layout = new QVBoxLayout(this);
// 创建 QTreeWidget
treeWidget = new QTreeWidget();
treeWidget->setHeaderLabels(QStringList() << "Column 1" << "Column 2");
// 添加一些示例数据
for (int i = 0; i < 5; ++i) {
QTreeWidgetItem *item = new QTreeWidgetItem(treeWidget);
item->setText(0, QString("Item %1").arg(i + 1));
item->setText(1, QString("Value %1").arg(i + 1));
}
layout->addWidget(treeWidget); // 将树形控件加入布局
// 创建三个按钮,并连接到带参数的槽
QPushButton *button1 = new QPushButton("Show Item Count");
QPushButton *button2 = new QPushButton("Show Selected Item");
QPushButton *button3 = new QPushButton("Show Message");
connect(button1, &QPushButton::clicked, this, [this]() { showItemCount(); });
connect(button2, &QPushButton::clicked, this, [this]() { showSelectedItem(); });
connect(button3, &QPushButton::clicked, this, [this]() { showMessage("Hello from Button 3!"); });
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);
setLayout(layout);
}
private slots:
void showItemCount() {
int count = treeWidget->topLevelItemCount();
QMessageBox::information(this, "Item Count", QString("Total items: %1").arg(count));
}
void showSelectedItem() {
auto currentItem = treeWidget->currentItem();
if(currentItem) {
QMessageBox::information(this,"Selected Item",
QString("You selected: %1")
.arg(currentItem->text(0)));
} else {
QMessageBox::warning(this,"No Selection","Please select an item.");
}
}
void showMessage(const QString &message) {
QMessageBox::information(this,"Message", message);
}
private:
QTreeWidget *treeWidget;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MyWindow window;
window.setWindowTitle("Signal and Slot Example with Parameters");
window.resize(400, 300);
window.show();
return app.exec();
}
#include "main.moc"
步骤解析:
自定义窗口类:创建一个名为
MyWindow
的类,继承自QWidget
。构造函数:
- 初始化布局、
QTreeWidget
和三个按钮。 - 使用 lambda 表达式将按钮的点击信号连接到带参数的槽。例如,直接调用
showMessage()
函数并传递字符串。
- 初始化布局、
槽函数:
showItemCount()
:计算树形视图中的项目总数并显示一个消息框。showSelectedItem()
:获取当前选中的项,如果有,则显示其文本;否则提示用户没有选择项。showMessage(const QString &message)
:接收字符串并通过消息框显示。
主函数:实例化窗口并启动应用程序。
注意事项:
- 当使用 lambda 表达式时,可以方便地创建内联匿名槽,实现灵活性和简洁性。
- 确保类包含
#include <QObject>
和定义了宏Q_OBJECT
,以支持信号和槽机制。
内容由零声教学AI助手提供,问题来源于学员提问