qt如何连接QPushButton的二维数组和return的位置
qt how to connect 2D array of QPushButton and return the location
我是 QT Creator GUI 的新手,在使用信号和槽时遇到困难。我正在使用 QT 4.2.1 制作一个用于练习的单词搜索拼图
下面是我的代码的一部分,使用矢量创建一个 2D 拼图。我尝试使用数组,但拼图的大小将由用户决定。我在使用数组时遇到了很多编译错误。所以我决定使用 Vector
我尝试了 post 中的一些选项:Get index of QPushButton on 2D array QPushButton 但它们都不起作用。
你能帮我看看为什么信号槽没有连接上吗?有没有办法检查信号是否已连接?
我将不胜感激任何帮助和反馈。谢谢!
void MainWindow::displayPuzzle(QVector<QVector<QPushButton*>>& button, QVector<QVector<QChar>> puzzle2D){
widget1 = new QWidget;
QGridLayout* l = new QGridLayout;
QSignalMapper mapper;
for (int r = 0; r < puzzle2D.size(); r++) {
QVector<QPushButton*> vect;
for (int c = 0; c < puzzle2D[r].size(); c++) {
//format the button
vect.push_back(new QPushButton);
vect.last()->setText(puzzle2D[r][c]);
vect.last()->setFixedSize(60,60);
vect.last()->show();
auto pos = QString{"%1 %2"}.arg(r).arg(c);
//connect with signals and slots
mapper.connect(vect.last(), SIGNAL(clicked()), SLOT(map()));
mapper.setMapping(vect.last(), pos);
//add button to layout
l->addWidget(vect.last(), r, c);
l->setSpacing(0);
l->setMargin(0);
l->setContentsMargins(-1,-1,-1,-1);
}
button.push_back(vect);
}
connect(&mapper, SIGNAL(mapped(QString)), SLOT(puzzleClick(QString)));
widget1->setLayout(l);
}
void MainWindow::puzzleClick(QString text){
int r = text.split(" ").at(0).toInt();
int c = text.split(" ").at(1).toInt();
QMessageBox::information(this, "click:", r + " " + c );
}
您链接的答案非常完整和有用,我认为您应该坚持使用那个。关于这些方法的任何建议都只是重写原始答案。也许你可以问一些更具体关于你不理解这些选项的问题。
该答案中未引用的另一种解决方案是实施 class 扩展 QPushButton,拦截 clicked() 信号并使用您想要的数据重新发射它。使用 Qt5 和 C++11 中的 lambda 函数可以获得相同的结果:看看这个: 这个问题的两个答案解释了如何做到这一点。
我是 QT Creator GUI 的新手,在使用信号和槽时遇到困难。我正在使用 QT 4.2.1 制作一个用于练习的单词搜索拼图
下面是我的代码的一部分,使用矢量创建一个 2D 拼图。我尝试使用数组,但拼图的大小将由用户决定。我在使用数组时遇到了很多编译错误。所以我决定使用 Vector
我尝试了 post 中的一些选项:Get index of QPushButton on 2D array QPushButton 但它们都不起作用。
你能帮我看看为什么信号槽没有连接上吗?有没有办法检查信号是否已连接? 我将不胜感激任何帮助和反馈。谢谢!
void MainWindow::displayPuzzle(QVector<QVector<QPushButton*>>& button, QVector<QVector<QChar>> puzzle2D){
widget1 = new QWidget;
QGridLayout* l = new QGridLayout;
QSignalMapper mapper;
for (int r = 0; r < puzzle2D.size(); r++) {
QVector<QPushButton*> vect;
for (int c = 0; c < puzzle2D[r].size(); c++) {
//format the button
vect.push_back(new QPushButton);
vect.last()->setText(puzzle2D[r][c]);
vect.last()->setFixedSize(60,60);
vect.last()->show();
auto pos = QString{"%1 %2"}.arg(r).arg(c);
//connect with signals and slots
mapper.connect(vect.last(), SIGNAL(clicked()), SLOT(map()));
mapper.setMapping(vect.last(), pos);
//add button to layout
l->addWidget(vect.last(), r, c);
l->setSpacing(0);
l->setMargin(0);
l->setContentsMargins(-1,-1,-1,-1);
}
button.push_back(vect);
}
connect(&mapper, SIGNAL(mapped(QString)), SLOT(puzzleClick(QString)));
widget1->setLayout(l);
}
void MainWindow::puzzleClick(QString text){
int r = text.split(" ").at(0).toInt();
int c = text.split(" ").at(1).toInt();
QMessageBox::information(this, "click:", r + " " + c );
}
您链接的答案非常完整和有用,我认为您应该坚持使用那个。关于这些方法的任何建议都只是重写原始答案。也许你可以问一些更具体关于你不理解这些选项的问题。
该答案中未引用的另一种解决方案是实施 class 扩展 QPushButton,拦截 clicked() 信号并使用您想要的数据重新发射它。使用 Qt5 和 C++11 中的 lambda 函数可以获得相同的结果:看看这个: