从 QStringList 为 QPushButton 创建一个指针

Making a pointer for a QPushButton from QStringList

我正在制作 QPushButtons 的 aAxB 网格 (image) 并将他们所有的名字存储到 QStringList 像这样

           QString Enemy_name = "Enemy_n"+QString::number(counter);
        counter++;

            QPushButton *Enemy_ship =new QPushButton(ui->Enemy);
            Enemy_ship->setObjectName(Enemy_name);
            Enemy_ship->setGeometry(15*b,15*i,10,10);
            Enemy_ship->setVisible(true);

            Enemy_name += "G";

            Enemy_names += Enemy_name;
        }
    }
    Enemy_list = Enemy_names.split("G");

此处正在使用列表中的存储值 我在哪里遇到一些转换错误 这是代码

void MainWindow::lastrow(){
int n=0;

QString firstinrow = Enemy_list[0];     //Getting QPushButton Objectname from the list
QPushButton *b = firstinrow;            //Making pointer *b for the object name
QString temp;                           //Same but temporary
QPushButton *btemp;                     //...
do{
    n++;                                //Counter for list position
    temp = &Enemy_list[n];              //Getting object name from position n in the list
    *btemp = temp;                      //temp button pointer
}while(!ui->*b->geometry.y() == ui->*btemp->geometry.y());      //checking Y of those 2 for not same Y
   // QString lastinrow = &Enemy_list[n-1];
}

错误

E:\QT\Try\mainwindow.cpp:81: Chyba: cannot convert 'QString' to 'QPushButton*' in initialization
     QPushButton *b = firstincol;
                      ^

E:\QT\Try\mainwindow.cpp:86: Chyba: invalid conversion from 'QString*' to 'char' [-fpermissive]
     temp = &Enemy_list[n];
          ^

E:\QT\Try\mainwindow.cpp:87: Chyba: no match for 'operator=' (operand types are 'QPushButton' and 'QString')
         *btemp = temp;
                ^

E:\QT\Try\mainwindow.cpp:88: Chyba: 'b->QWidget::geometry' does not have class type
     }while(!ui->*b->geometry.y() == ui->*btemp->geometry.y());


E:\QT\Try\mainwindow.cpp:88: Chyba: 'btemp->QWidget::geometry' does not have class type
 }while(!ui->*b->geometry.y() == ui->*btemp->geometry.y());
                                      ^
                  ^

能否请您具体说明是什么问题?正如编译器所写的那样,由于错误,不可能使 QPushButton 形成 QString 等等。你无法理解哪里出了问题或什么?很抱歉,没有足够的评分将其写在评论中。之后会删除,或者给出完整答案。

如果我理解你的问题,你需要一个关联数组(键:值,key1:value ...),当 "key" 是按钮的名称并且值是对象按钮时。

在Qt中,QMap就是用来做这个的。

下面是如何使用它的简单演示。

文件mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QMap>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void whoIam();

private:
    Ui::MainWindow *ui;
    QMap<QString, QPushButton *> list;

};

#endif // MAINWINDOW_H

文件mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);    

    for(int i = 0; i < 10; i++){
        QPushButton *button = new QPushButton(this);
        button->setGeometry(i*70,20,60,40);
        button->setObjectName("key_"+QString::number(i));
        button->setText(button->objectName());
        connect(button,SIGNAL(clicked(bool)),this,SLOT(whoIam()));
        list.insert(button->objectName(),button);
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::whoIam()
{
  QPushButton *button = dynamic_cast<QPushButton *>(sender());
  QString message = QString("Hi, I am a QPushButton %1\nI am at x: %2, y: %3.")
          .arg(button->objectName())
          .arg(button->geometry().x())
          .arg(button->geometry().y());
  QMessageBox::information(this,"Information",message);

  button = dynamic_cast<QPushButton *>(list["key_1"]);
  message = QString("Hi, I am a QPushButton %1\nI am at x: %2, y: %3.")
            .arg(button->objectName())
            .arg(button->geometry().x())
            .arg(button->geometry().y());
  QMessageBox::information(this,"Information",message);
}

在构造函数中我创建了 10 个按钮,设置他的参数,将单击的操作连接到我的函数(专用插槽:whoIam())并将按钮插入列表。

在 whoIam() 中,我使用 dynamic_cast 来转换 QPushButton。第一次,获取有关触发事件的对象的信息,第二次,作为对列表中关键变量 "key_1" 的示例调用。