gpt4 book ai didi

c++ - Qt 和 C++ - 我自己的类和信号/槽

转载 作者:行者123 更新时间:2023-11-28 00:13:50 24 4
gpt4 key购买 nike

我已经通过编写一个简单的 GUI 开始使用 C++ 学习 Qt。一开始,在学习了信号和槽的机制后,我决定编写程序,使我们能够控制工业机器人 ARM 。所以这个想法很简单:我们有 6 个按钮,根据我们按下的是哪个按钮,然后会出现一个文本来描述我们做了什么;例如:“ ARM 向左移动”。

我将构建它,但首先我有一些问题要问你。

这是我的代码:

ARM .h:

#ifndef ARM_H
#define ARM_H

#include <QVector>
#include <QString>
#include <QLabel>

class Arm{

public:
Arm();
static void displayMoves(QLabel *ptrQLabel); //function for display QString listMoves
QVector<bool(*)(void)> vctrMovesFun; //contains pointers for function which defines moves of industrial robot

private:
static QString listMoves; //contain every move which industrial robot has done

static bool moveArmForward();
static bool moveArmBackward();
static bool moveArmLeft();
static bool moveArmRight();
static bool spinArmLeft();
static bool spinArmRight(); //all this functions define moves of robot's arm
};

#endif // ARM_H

ARM .cpp:

#include "arm.h"

QString Arm::listMoves = ""; //empty string
//***************************************************************
Arm::Arm(){
vctrMovesFun = {&moveArmForward, &moveArmBackward, &moveArmLeft,
&moveArmRight, &spinArmLeft, &spinArmRight}; //set reference to functions
}
//***************************************************************
bool Arm::moveArmForward(){
listMoves+= "Arm moved forward\n";
return true;}
//***************************************************************
bool Arm::moveArmBackward(){
listMoves+= "Arm moved backward\n";
return true;}
//***************************************************************
bool Arm::moveArmLeft(){
listMoves+= "Arm moved to the left\n";
return true;}
//***************************************************************
bool Arm::moveArmRight(){
listMoves+= "Arm moved to the right\n";
return true;}
//***************************************************************
bool Arm::spinArmLeft(){
listMoves+= "Arm spinned to the left\n";
return true;}
//***************************************************************
bool Arm::spinArmRight(){
listMoves+= "Arm spinned to the right\n";
return true;}
//***************************************************************
void Arm::displayMoves(QLabel *ptrQLabel){
ptrQLabel -> setText(listMoves);
}

主窗口.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "arm.h"

#include <QMainWindow>
#include <QPushButton>

namespace Ui {
class MainWindow;}

class MainWindow : public QMainWindow{
Q_OBJECT

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

private:
Ui::MainWindow *ui;
QPushButton *button0;
QPushButton *button1;
QPushButton *button2;
QPushButton *button3;
QPushButton *button4;
QPushButton *button5;

QLabel *label;

Arm arm;

private slots:
void useVector0();
void useVector1();
void useVector2();
void useVector3();
void useVector4();
void useVector5();

};

#endif // MAINWINDOW_H

主窗口.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui -> setupUi(this);
this -> setGeometry(0,0,800,700);
this -> setStyleSheet("background-color:rgb(188, 198 ,204)");

button0 = new QPushButton("Move forward", this);
button0 -> setGeometry(50,50, 100,50);
button0 -> setStyleSheet("background-color:rgb(108, 118, 143)");
connect(button0, SIGNAL (clicked()), this, SLOT (useVector0()));

button1 = new QPushButton("Move backward", this);
button1 -> setGeometry(50,150, 100,50);
button1 -> setStyleSheet("background-color:rgb(108, 118, 143)");
connect(button1, SIGNAL (clicked()), this, SLOT (useVector1()));

button2 = new QPushButton("Move left", this);
button2 -> setGeometry(50,250, 100,50);
button2 -> setStyleSheet("background-color:rgb(108, 118, 143)");
connect(button2, SIGNAL (clicked()), this, SLOT (useVector2()));

button3 = new QPushButton("Move right", this);
button3 -> setGeometry(50,350, 100,50);
button3 -> setStyleSheet("background-color:rgb(108, 118, 143)");
connect(button3, SIGNAL (clicked()), this, SLOT (useVector3()));

button4 = new QPushButton("Spin left", this);
button4 -> setGeometry(50,450, 100,50);
button4 -> setStyleSheet("background-color:rgb(108, 118, 143)");
connect(button4, SIGNAL (clicked()), this, SLOT (useVector4()));

button5 = new QPushButton("Spin right", this);
button5 -> setGeometry(50,550, 100,50);
button5 -> setStyleSheet("background-color:rgb(108, 118, 143)");
connect(button5, SIGNAL (clicked()), this, SLOT (useVector5()));

label = new QLabel("", this);
label ->setStyleSheet("background-color:rgb(0, 0, 0)");
label -> setGeometry(300,50,300,600);
}


//************************************************************************
MainWindow::~MainWindow(){
delete ui;
}
//*************************************************************************
void MainWindow::useVector0(){
arm.vctrMovesFun[0]();
arm.displayMoves(label);}
//*************************************************************************
void MainWindow::useVector1(){
arm.vctrMovesFun[1]();
arm.displayMoves(label);
}
//*************************************************************************
void MainWindow::useVector2(){
arm.vctrMovesFun[2]();
arm.displayMoves(label);
}
//*************************************************************************
void MainWindow::useVector3(){
arm.vctrMovesFun[3]();
arm.displayMoves(label);
}
//*************************************************************************
void MainWindow::useVector4(){
arm.vctrMovesFun[4]();
arm.displayMoves(label);
}
//*************************************************************************
void MainWindow::useVector5(){
arm.vctrMovesFun[5]();
arm.displayMoves(label);
}

main.cpp :

#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

MainWindow w;
w.show();

return a.exec();
}

如您所见,没有什么特别之处。我的问题:

  1. 我不明白MainWindow 类中的ui。它是什么以及它对 Qt 有何帮助?

  2. 当我创建指向我的函数的指针 vector 时,我需要将它们设为静态,换句话说,我不能将它们放入 vector 中。为什么? (类 Arm)

  3. MainWindow 中的构造函数。通常构造函数在我们创建对象时只被调用一次,那么为什么 MainWindow.cpp 中的方法 connect 对整个程序都有效?

  4. 如您所见,有 6 种方法可以使用我自己的函数。例如,我将它们命名为:void useVector0()。我真的很确定这样做是非常糟糕的。应该有一种方法,但如果我做类似的事情:

    void MainWindow::useVector(unsigned short k){
    arm.vctrMovesFun[k]();
    arm.displayMoves(label);

    我不能将它用作插槽,因为信号 clicked() 没有参数。如何解决?重载 clicked() 方法?

  5. 也许你对我的代码有一个大概的看法,所以写吧。每一句批评我都会很高兴。

最佳答案

正如其他人已经指出的,您的问题需要改进。我建议你阅读 How to ask ,在那里你会找到关于 what can I ask around here 的好指南和 how do I ask a nice question .

不过,我将简要回答您的问题,希望它能让您提出更具体的新问题(如果有的话)。


  1. 什么是“Qt-Form-Class”的 .ui 文件?

    现在您正在 MainWindow 的构造函数中创建按钮。这对于简单的 GUI 可能没问题,但您必须“猜测”按钮的位置。

    如果您使用 Qt Designer您可以借助一些工具来创建您的布局。在设计器中放置了一些元素后,您将能够通过如下代码访问它们:

    ui->label1->setText("hello World");

    您可以通过在代码中使用 connect() 或使用 Designer 将它们添加到 UI 文件,将这些 UI 小部件的信号连接到插槽。


  1. 如何创建指向成员函数的指针?

    http://en.cppreference.com/w/cpp/language/pointer#Pointers_to_member_functions

  1. 不确定你在这里问什么

  1. 如何根据发送者在一个槽中执行不同的代码?

    看看QSignalMapper .

    它不会像您要求的那样给您一个 unsigned short k,而是一个 QString,具体取决于哪个小部件发出了信号。


  1. 你能检查我的代码吗?

    现在这绝对是 Code Review 的问题Stack Exchange 网站。

关于c++ - Qt 和 C++ - 我自己的类和信号/槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31595605/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com