在Q ++中将数据从Qt传递到原始类型

时间:2014-01-17 16:59:21

标签: c++ qt

我在Qt编写的GUI上有一个按钮。此按钮的作用是将整数值增加2.然后,此新值将显示在同一GUI上的窗口小部件中。我的目标是将此递增的值传递给原始数据类型,在本例中为int。

增量按钮允许您递增GUI上显示的值,这意味着我在这两个GUI元素之间使用了SIGNAL和SLOT协议。

SIGNAL和SLOT与动作侦听器协议不同,因此,我似乎无法更新int我将鼠标按钮单击存储此值。每次用户单击GUI上的增量按钮时,我都需要能够更新此int值....最终目标是将此值传递给C ++中其他地方编写的另一个数学函数。以下是我试图找出如何做到这一点的尝试。注意,GUI运行的整个时间,只打印出一个值,即outVal中存储的初始值。如果这个使用过的动作监听器那么这将是一个非问题。所以我的问题是,每次点击鼠标时如何更新outVal ...谢谢!

#include <QApplication>
#include <QGridLayout>
#include <QLabel>
#include <QSpinBox>

#include <string>
#include <stdlib.h>
#include <stdio.h>


#define MIN_WIDTH 350
#define MIN_HEIGHT 300

int main(int argc, char ** argv){

    int outVal = 99;

    QApplication a(argc, argv);

    QWidget window;

    window.setMinimumSize(MIN_WIDTH,MIN_HEIGHT);


    QVBoxLayout * mainPlatter = new QVBoxLayout(&window);
    QSpinBox * spinBox = new QSpinBox;


    spinBox->setRange(1,77);
    spinBox->setSingleStep(2);






    QLabel * label = new QLabel("1");





    mainPlatter->addWidget(spinBox);;
    mainPlatter->addWidget(label);
    QObject :: connect( spinBox, SIGNAL(valueChanged(int)) , label, SLOT(setNum(int)));



    outVal = spinBox->value();
    window.show();


    printf("%d\n",outVal);

    return a.exec();



    return 0;
}

编辑:在得到建议之后,这就是我试过的

#include <iostream>
#include <QObject>
using namespace std;

class Counter : public QObject{
    Q_OBJECT
     signals:
            void valueChanged(int newValue);
    public:
            Counter(){
                    m_value = 1;
            }
            int value() const {
                    return m_value;
            }
    public slots:
            void setValue(int value);
    private:
            int m_value;

 };
void Counter::setValue(int value){ 
    if(value != m_value){ 
            m_value = value;
            emit valueChanged(value);
    }

}
int main(void){
    Counter a, b;
    QObject :: connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));

    a.setValue(7);

    cout << "a.setValue(7) " << endl;
    cout << "(a.value, b.value) = " << a.value() << b.value() << endl;



    return 0;
}

这些是我的错误

g ++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I / usr / share / qt5 / mkspecs / linux-g ++ - 64 -I。 -一世。 -I / usr / include / qt5 -I / usr / include / qt5 / QtWidgets -I / usr / include / qt5 / QtGui -I / usr / include / qt5 / QtCore -I。 -o example1.o example1.cpp g ++ -m64 -Wl,-O1 -o gui1 example1.o -L / usr / X11R6 / lib64 -lQt5Widgets -L / usr / lib / x86_64-linux-gnu -lQt5Gui -lQt5Core -lGL -lpthread example1.o:在函数Counter::setValue(int)': example1.cpp:(.text+0x9): undefined reference to Counter :: valueChanged(int)'中 example1.o:在函数main': example1.cpp:(.text.startup+0x25): undefined reference to vtable for Counter'中 example1.cpp :(。text.startup + 0x94):对`Counter :: valueChanged(int)'的未定义引用 collect2:错误:ld返回1退出状态 make: * [gui1]错误1

一个FYI;我跑了“qmake -project”然后“qmake”然后“make”。

编辑:最终的工作版本!故事的道德,使用头文件,函数定义和驱动程序在不同的c ++文件中将所有内容放在适当的位置,这使得使用QT时的生活变得更加容易。这里的具体问题是MOC没有运行,因为驱动程序(main)和QObject类在同一个文件中。

//function.h
#ifndef FUNCTION_H
#define FUNCTION_H
#include <QObject>

class Counter : public QObject {
    Q_OBJECT

    public:
            Counter(){
                    m_value = 1;
            }
            int value() const {
                    return m_value;
            }
    public slots:
            void setValue(int value);
    signals:
            void valueChanged(int newValue);
    private:
            int m_value;

};

#endif

//function.cpp
#include "function.h"
void Counter :: setValue(int value){ 
    if(value != m_value){ 
            m_value = value;
            emit valueChanged(value);
    }

}

//main.cpp
#include <iostream>
#include <QObject>

#include "function.h"
using namespace std;

int main(void){
 Counter a, b;
    QObject :: connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));

    a.setValue(7);

    cout << "a.setValue(7) " << endl;
    cout << "(a.value, b.value) = " << a.value() << b.value() << endl;


    return 0;
}

1 个答案:

答案 0 :(得分:2)

  

增量按钮允许您增加GUI上显示的值,这意味着ive (原文如此)在这两个GUI元素之间使用了SIGNAL和SLOT协议

这就是问题所在。您应该做的是将任何数据模型与其可视化表示分开。如果将数据存储在类中,我们将其称为Model,然后将按钮连接到Model类中的插槽,插槽函数可以更新其值,然后发出信号以更新数据视图。

例如:

class Model : public QObject
{
    Q_OBJECT

    signals:
        // connect this signal to the spin box setValue slot
        void UpdateView(int value);

    public slots:
        // connect this slot to the push button released() signal
        void IncrementValue();

    private:
        int m_value;
}

void Model::IncrementValue()
{
    m_value += 2;
    emit UpdateView(m_value);
}

有一个伟大的设计模式扩展了这个名为MVC(Model View Controller