从QStringList制作QPushButton的指针

时间:2017-04-13 18:31:35

标签: c++ pointers grid qt-creator qpushbutton

我正在制作一个QPushButtons的AxB网格 (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());
                                      ^
                  ^

2 个答案:

答案 0 :(得分:0)

请说明问题是什么?正如编译器所写的那样,由于错误,不可能使QPushButton形成QString等等。你不能理解什么是错的或什么?对不起,没有足够的raiting在评论中写下来。将在之后删除,或给出完整答案。

答案 1 :(得分:0)

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

在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”的示例。