【问题标题】:How do I run a command from a button press Qt - C++ probably如何从按钮按下 Qt 运行命令 - 可能是 C++
【发布时间】:2013-12-31 06:53:30
【问题描述】:

当我试图完成一个程序并且我想要一个图形界面时,我正在尝试非常快速地重建一个 QT 应用程序作为 QT Creator 提供的示例。以下是我希望相关的部分:

arrowpad.h:

#ifndef ARROWPAD_H
#define ARROWPAD_H

#include <QWidget>

QT_BEGIN_NAMESPACE
class QPushButton;
QT_END_NAMESPACE

//! [0]
class ArrowPad : public QWidget
//! [0] //! [1]
{
//! [1] //! [2]
    Q_OBJECT
//! [2]

public:
    ArrowPad(QWidget *parent = 0);

private:
    QPushButton *upButton;
    QPushButton *downButton;
    QPushButton *leftButton;
    QPushButton *rightButton;
};

#endif

arrowpad.cpp:

#include <QtGui>

#include "arrowpad.h"

ArrowPad::ArrowPad(QWidget *parent)
    : QWidget(parent)
{
//! [0]
    upButton = new QPushButton(tr("&Up"));
//! [0] //! [1]
    downButton = new QPushButton(tr("&Down"));
//! [1] //! [2]
    leftButton = new QPushButton(tr("&Left"));
//! [2] //! [3]
    rightButton = new QPushButton(tr("&Right"));
//! [3]

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget(upButton, 0, 1);
    mainLayout->addWidget(leftButton, 1, 0);
    mainLayout->addWidget(rightButton, 1, 2);
    mainLayout->addWidget(downButton, 2, 1);
    setLayout(mainLayout);
}

当我按下按钮时,如何让它运行命令?我找到了this,但我不知道如何与 qpushbutton 集成,否则它只是认为它是一串文本...... 任何命令都必须在 LINUX - FEDORA 19 中工作,因为那是我正在运行它。

这是当前的结果——顺便说一下,在上面的.cpp 脚本中,我不认为按钮名称被指定为(tr("&amp;Up"));

【问题讨论】:

  • 三遍告诉我们你很着急真的无济于事。但它可能会适得其反。

标签: c++ qt command-line qt-creator


【解决方案1】:

Apartidge 是对的,但要添加到这一点并将多个按钮连接到相同的功能,您只需连接正确的信号和插槽。

你的例子:

connect(upButton, SIGNAL(clicked()), this, SLOT(onButtonPressed()));
connect(downButton, SIGNAL(clicked()), this, SLOT(onButtonPressed()));
connect(leftButton, SIGNAL(clicked()), this, SLOT(onSomeOtherButtonPressed()));
connect(rightButton, SIGNAL(clicked()), this, SLOT(onYetAnotherButtonPressed()));

将它放在你的构造函数中会将 upButton 和 downButton 连接到同一个插槽 onButtonPressed()。 leftButton 会触发 onSomeOtherButtonPressed(),rightButton 会触发 onYetAnotherButtonPressed()。

【讨论】:

  • 我知道了,我从 JavaScript 编程中知道类​​似的东西,只是我在接收端遇到了一些问题......
【解决方案2】:

按钮在被点击时会发出pressed 信号。您必须做的是将此信号连接到一个插槽,然后在该插槽中执行您的操作。

例如,

ArrowPad::ArrowPad(QWidget *parent)
    : QWidget(parent)
{

    upButton = new QPushButton(tr("&Up"));
    connect(upButton, SIGNAL(clicked()), this, SLOT(onButtonPressed()));
    // And so on for the other buttons
}

void ArrowPad::onButtonPressed()
{
    // Button is pressed, do actions
}

【讨论】:

  • 您需要提高您的 C++ 技能。在 arrowpad.h 中,在类内,编写“void onButtonPressed();”。然后将整个方法移动到您的 ArrowPad::ArrowPad 方法下方(在您的 .cpp 文件中)。请阅读linuxgazette.net/issue55/williams.html
  • 差不多了,但是我如何让它为多个按钮工作 - 每个按钮都有不同的命令,每个按钮不会只调用同一个按钮吗? - 将onButtonPressed() 更改为whateverILike() 会起作用,不是吗?我对 HTML、CSS 和 bash 很满意,我知道一些 C 和 Python,但是 C++.... :-s
【解决方案3】:

在 qt 中,大多数事情都是通过信号/插槽机制工作的。 因此,您定义了一些插槽并简单地将信号连接到它们。

arrowpad.h

#ifndef ARROWPAD_H
#define ARROWPAD_H

#include <QWidget>

QT_BEGIN_NAMESPACE
class QPushButton;
QT_END_NAMESPACE

//! [0]
class ArrowPad : public QWidget
//! [0] //! [1]
{
//! [1] //! [2]
    Q_OBJECT
//! [2]

public:
    ArrowPad(QWidget *parent = 0);

private:
    QPushButton *upButton;
    QPushButton *downButton;
    QPushButton *leftButton;
    QPushButton *rightButton;



// 1- Here you declare the slots
private slots:
 void onUpButtonClick();
 void onDownButtonClick();
 void onLeftButtonClick();
 void onRightButtonClick();
};

#endif

现在在 arrowpad.cpp 中

#include <QtGui>

#include "arrowpad.h"

ArrowPad::ArrowPad(QWidget *parent)
    : QWidget(parent)
{
//! [0]
    upButton = new QPushButton(tr("&Up"));
//! [0] //! [1]
    downButton = new QPushButton(tr("&Down"));
//! [1] //! [2]
    leftButton = new QPushButton(tr("&Left"));
//! [2] //! [3]
    rightButton = new QPushButton(tr("&Right"));
//! [3]

// 2- Connect signals to slots
  QObject::connect(upButton, signal(clicked()), this, slot(onUpButtonClick()));

  QObject::connect(downButton, signal(clicked()), this, slot(onDownButtonClick()));

  QObject::connect(rightButton, signal(clicked()), this, slot(onRightButtonClick()));

  QObject::connect(leftButton, signal(clicked()), this, slot(onLeftButtonClick()));


    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget(upButton, 0, 1);
    mainLayout->addWidget(leftButton, 1, 0);
    mainLayout->addWidget(rightButton, 1, 2);
    mainLayout->addWidget(downButton, 2, 1);
    setLayout(mainLayout);
}

// 3- Define the slots
 void ArrowPad::onUpButtonClick()
{
   qDebug() << "onUpButtonClick clicked";
}
 void ArrowPad::onDownButtonClick()
{
   qDebug() << "onDownButtonClick clicked";
}
 void ArrowPad::onLeftButtonClick()
{
   qDebug() << "onLeftButtonClick clicked";
}
 void ArrowPad::onRightButtonClick()
{
   qDebug() << "onRightButtonClick clicked";
}

【讨论】:

    【解决方案4】:

    您是否尝试过了解 SIGNAL 和 SLOT 机制?

    http://doc.qt.io/qt-4.8/signalsandslots.html

    【讨论】:

    • 不,我已经习惯了 JavaScript 的概念来创建一个事件,比如 onClick='someFunction()',而不是所有这些东西......我想做一个 webapp,但它不能真正做命令还有东西(我想这也是一件好事,这将是一个巨大的安全漏洞......)
    • 好吧,如果你想专门使用 Qt,你需要使用那个链接。最佳起点
    • 玩得开心,请确保您正在阅读与您的 Qt 版本相匹配的文档版本,它可能是与 #include s 和其他配置相关的细微更改
    • 第 11 行,你有一个额外的;
    • 刚刚注意到我多了一个;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2014-06-18
    • 2019-05-10
    • 2022-01-24
    相关资源
    最近更新 更多