在 Qt 中一次将相同的操作分配给 gridLayout 中的多个按钮
Assigning same action to multiple buttons in gridLayout at once in Qt
我刚开始使用 Qt Designer,我不知道如何将相同的操作分配给更多的按钮。我创建了一个 gridLayout 17x17,由 289 个按钮组成。我希望每个按钮在单击时都能更改其文本。可能吗?
你想把之前选中的按钮的文字复制到另一个按钮上,你要声明一个属性吗class我会调用text,选中的文字会被保存,我会调用之前选择的按钮previousBtn
,那么每次点击,都必须写入那个变量。
text = previousBtn->text();
我们可以通过itemAtPosition
函数得到QGridLayout
的所有QLayoutItem
,然后我们通过widget()函数得到widget并转换为qobject_cast
,将它连接到onClicked
插槽,得到用sender()
生成它的按钮并将其转换为QPushButton
,并放置新文本。
*.h
private:
QString text;
private slots:
void onClicked();
*.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
for(int i=0; i < ui->gridLayout->rowCount(); i++)
for(int j=0; j < ui->gridLayout->columnCount(); j++){
QLayoutItem* item = ui->gridLayout->itemAtPosition(i, j);
if(item->widget()){
QPushButton* btn = qobject_cast<QPushButton *>(item->widget());
connect(btn, &QPushButton::clicked, this, &MainWindow::onClicked);
}
}
}
void MainWindow::onClicked()
{
QPushButton *btn = qobject_cast<QPushButton *>(sender());
btn->setText(text);
}
我刚开始使用 Qt Designer,我不知道如何将相同的操作分配给更多的按钮。我创建了一个 gridLayout 17x17,由 289 个按钮组成。我希望每个按钮在单击时都能更改其文本。可能吗?
你想把之前选中的按钮的文字复制到另一个按钮上,你要声明一个属性吗class我会调用text,选中的文字会被保存,我会调用之前选择的按钮previousBtn
,那么每次点击,都必须写入那个变量。
text = previousBtn->text();
我们可以通过itemAtPosition
函数得到QGridLayout
的所有QLayoutItem
,然后我们通过widget()函数得到widget并转换为qobject_cast
,将它连接到onClicked
插槽,得到用sender()
生成它的按钮并将其转换为QPushButton
,并放置新文本。
*.h
private:
QString text;
private slots:
void onClicked();
*.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
for(int i=0; i < ui->gridLayout->rowCount(); i++)
for(int j=0; j < ui->gridLayout->columnCount(); j++){
QLayoutItem* item = ui->gridLayout->itemAtPosition(i, j);
if(item->widget()){
QPushButton* btn = qobject_cast<QPushButton *>(item->widget());
connect(btn, &QPushButton::clicked, this, &MainWindow::onClicked);
}
}
}
void MainWindow::onClicked()
{
QPushButton *btn = qobject_cast<QPushButton *>(sender());
btn->setText(text);
}