想要为 setTimer 和 setText 添加按钮

Posted

技术标签:

【中文标题】想要为 setTimer 和 setText 添加按钮【英文标题】:Want to add pushbutton to setTimer and setText 【发布时间】:2016-08-02 09:43:54 【问题描述】:

我是 GUI 设计的新手。在这里,在使用 DDS(OpenSplice)发送和接收消息(浮点数、整数值)时,我试图向我已经存在的标签添加一个按钮(显示一些浮点值,如下所示),以便在单击按钮后,我应该能够在我的标签中看到数据。 我尝试在 Qt Network sender Example 的帮助下添加一个按钮。现在我在构建项目时收到错误在 moc_mainwindow.cpp 文件中对 'MainWindow::on_pushButton_clicked() 的未定义引用

fastsender.cpp

FastSender::FastSender(QLabel *x, QObject *parent) : QObject(parent)

wSend = x;
dataTimer = new QTimer(this);
emergency = new QPushButton(tr("Emergency"));
buttonBox = new QDialogButtonBox;
buttonBox->addButton(emergency,QDialogButtonBox::ActionRole);


connect(emergency, SIGNAL(clicked()), this, SLOT(startsending()));
connect(dataTimer, SIGNAL(timeout()), this, SLOT(walk()));
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(buttonBox);


void FastSender::startsending()

emergency->setEnabled(false);
dataTimer->start(100); // Interval 0 means to refresh as fast as possible



int FastSender::walk()

msg->value= i+0.1;
snprintf (buf, MAX_MSG_LEN, "Message no. %d", i);

cout << "Writing message: \"" << msg->value << "\"" << endl;
status = talker->write(*msg, userHandle);

QString s=  QString::number(msg->value, 'f',8);
wSend->setText(s);

fastsender.h

class FastSender : public QObject

Q_OBJECT
public:
explicit FastSender(QObject *parent = 0);
FastSender(QLabel *x, QObject *parent = 0);
~FastSender();
signals:

private:
QTimer* dataTimer;
QLabel *wSend;
DDS::DomainParticipantFactory_var       dpf;

DDS::DomainParticipant_var              parentDP;
DDS::Topic_var                          signalTopic;
DDS::DataReader_var                     parentReader;
DDS::DataWriter_var                     parentWriter;
fw::signalSeq_var                       msgSeq;
char  *                                 signalTypeName;
fw::signalDataWriter_var                talker;
fw::signal                              *msg;
DDS::InstanceHandle_t                   userHandle;
DDS::Publisher_var                      fwPublisher;
int                                     alpa;
QPushButton                             *emergency;
QDialogButtonBox                        *buttonBox;

public slots:

int walk();
int hello();
void startsending();
;

ma​​inwindow.cpp

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)

ui->setupUi(this);
fwdds = new FastWanDDS(ui->label);//receiving values are displayed in label
fwdds1 = new FastSender(ui->label_2);//Sending values are displayed in label_2

ma​​inwindow.h

Ui::MainWindow *ui;
QTimer* timer;
int counter;
FastWanDDS *fwdds;
FastSender *fwdds1;

感谢任何帮助。

注意:仅呈现代码的 sn-ps

【问题讨论】:

我不明白你的问题是什么。 QLabel 中的文字没有显示吗?注意:repaint() 在 MainWindow 构造函数返回后调用一次。这很可能在调用walk() 之前。因此,我猜是更新问题。只需尝试调整/移动您的应用程序并查看重绘是否绘制了新值。 (如果有,可以使用wSend-&gt;update()更新walk()中的Label) @BernhardHeinrich 运行可执行文件时正在显示文本。现在我希望窗口打开并等待我单击按钮来设置文本。毕竟我想添加一个按钮 如果要添加更多详细信息,请告诉我 @AkhilChandraMaganti 如果我的回答对您有用,请奖励我。否则,如果您还有其他问题,请告诉我。 ***.com/help/privileges/set-bounties 嗨 Akhil,对不起,我仍然不明白这个问题....您想将“紧急”按钮添加到 MainLayout 吗? - 要添加到 MainWindow,您应该用真正的 mainLayout 替换行 QVBoxLayout *mainLayout = new QVBoxLayout;。 (使用 FastSender 的构造函数参数 parentthis,将 parent 转换为 QMainWindow* 和我们的 QMainWindow::centralWidget()-&gt;layout())。或者,稍微简单一点:将紧急按钮添加到 ui。 【参考方案1】:

我让它以这种方式工作。这对你有用吗?

ma​​inwindow.cpp

#include "mainwindow.h"
#include "fastsender.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)

    QLabel* label = new QLabel("unchanged");
    FastSender* fs = new FastSender(label);
    setCentralWidget(fs);


MainWindow::~MainWindow()



fastsender.h

#ifndef FASTSENDER_H
#define FASTSENDER_H

#include <QLabel>
#include <QTimer>
#include <QPushButton>
#include <QDialogButtonBox>
#include <QHBoxLayout>

class FastSender : public QWidget

    Q_OBJECT
public:
    FastSender(QLabel* label, QWidget* parent = 0)
        : QWidget(parent)
        , _label(label)
        , _timer(new QTimer)
        , _emergency(new QPushButton(tr("Emergency")))
        , _bbox(new QDialogButtonBox)
    
        _bbox->addButton(_emergency, QDialogButtonBox::ActionRole);

        QHBoxLayout* layout = new QHBoxLayout;
        layout->addWidget(_label);
        layout->addWidget(_bbox);

        setLayout(layout);

        connect(_emergency, SIGNAL(clicked(bool)), this, SLOT(startsending()));
        connect(_timer, SIGNAL(timeout()), this, SLOT(walk()));
    

public slots:
    void startsending()
    
        _emergency->setEnabled(false);
        _timer->start(100);
    

    int walk()
    
        _label->setText("changed");
        _emergency->setEnabled(true);
    

private:
    QLabel* _label;
    QTimer* _timer;
    QPushButton* _emergency;
    QDialogButtonBox* _bbox;
;

#endif // FASTSENDER_H

【讨论】:

以上是关于想要为 setTimer 和 setText 添加按钮的主要内容,如果未能解决你的问题,请参考以下文章

按名称查找 QLabel 并使用 setText() 函数

AutoCompleteTextView (setText) 和 fragment.detach().attach()

DialogFragment - 访问布局组件的位置[即editText.setText(“”)]

Jtextfield setText() 根本不起作用

JavaFX,标签setText中的倒数计时器

在android中动态添加按钮的问题