How to connect qml slider into a button using cpp method ?
-
Hi Andre,
I too tried to connect the slider using your code but i am not able to get the solution.As i am new to QML i dont what will be the coding to start and stop the slider.
Could you please help me?
Here is my code which i have tried from your code:
@
#include"audiobuffer.h"void AudioBuffer::start()
{
if(sliderValue() == m_sliderValue)
{
emit sliderValue();
}
}void AudioBuffer::stop()
{
if(sliderValue() != m_sliderValue)
{
emit sliderValue();
}}
void AudioBuffer::setSliderValue(double value)
{
if (value == m_sliderValue)
return;m_sliderValue = value; emit sliderValueChanged(m_sliderValue);
}
@
I was wrong somewhere and could you please tell me what is the mistake???
-
I would assume that start and stop actually do something, right? What are they supposed to do exactly? The code you have for the start and stop at the moment is useless, and wrong as well. The idea is that whatever process you start or stop will use setSetValue to communicate (I assume) progress.
-
Using exclamation points will not make your point more clear. They just look like screaming in text, and as you know, screaming is not a polite way of communicating...
If you want to make the sliders move, I suggest you use a timer or perhaps use a QPropertyAnimation in the AudioBuffer object. However, if making the slider much as such is all you want to achieve, there is no need for going through C++ at all. QML has all the animation tools you need.
I was under the impression that the slider should reflect some kind of progress for some more complicated process, like playing an audio file. In that case, the slider value would be manipulated by the actual progress of that process, not by some random animation.
-
Hi Andre,
Actually i am trying to record,stop and play an audio file.What i am expecting is:when i click on the record button the slider should start moving showing the time duration and when i click on the stop button the slider should stop as required.This is my code and what i had tried so far:
main.qml:
@
import QtQuick 1.0
import com.nokia.symbian 1.0
import Qt 4.7Page {
id: mainPageButton{
id: rec
x: 0
y: 440
width: 93
height: 50
text: "Record"
anchors.bottomMargin: 210
anchors.leftMargin: 0
onClicked: {StringHelper.record();
}
}
Button{
id: b
x: 98
y: 440
width: 86
height: 50
text: "Pause"
anchors.bottomMargin: 210
anchors.leftMargin: 0
onClicked: {
StringHelper.pause();}
}
Button{
id: stp
x: 188
y: 440
width: 82
height: 50
text: "Stop"
anchors.bottomMargin: 210
anchors.leftMargin: 30
onClicked: {
StringHelper.stop()
}
}Button{
id: ply
x: 272
y: 440
width: 89
height: 50text: "Play" anchors.bottomMargin: 210 anchors.leftMargin: 25
onClicked: {
StringHelper.play()
}
}Button{
id: exit
x: 295
y: 22
text: "Exit"
MouseArea {id: mouseArea6;
anchors.fill: parent
onClicked: {Qt.quit();
}
}
}TextEdit {
id: text
x: 82
y: 22
width: 142
height: 30
color: "#1339f5"
text: qsTr("Voice Recorder")
font.family: "Times New Roman"
textFormat: TextEdit.RichText
font.pixelSize: 30
}Image {
id: image
x: 0
y: 115
width: 360
height: 306
source: "img.jpg"
}Slider {
id: slider
x: 0
y: 57
width: 360
height: 59
orientation: 1
stepSize: 1
minimumValue: 0
maximumValue: 30
valueIndicatorVisible: true
value: StringHelper.sliderValue}
}
@stringhelper.h:
@
#include <QObject>
#include <QAudioCaptureSource>
#include <QMediaRecorder>class StringHelper : public QObject
{
Q_OBJECTQ_PROPERTY (double sliderValue READ sliderValue WRITE setSliderValue NOTIFY sliderValueChanged)
public:
StringHelper();
~StringHelper();
inline double sliderValue() const {return m_sliderValue;}public slots:
void stop();
void play();
void record();
QUrl generateAudioFilePath();
void pause();
void setSliderValue(double);signals:
void sliderValueChanged(double newValue);private:
QAudioCaptureSource *audioSource;
QMediaRecorder *capture;
bool active;
double m_sliderValue;};
#endif // STRINGHELPER_H
@stringhelper.cpp:
@
#include "stringhelper.h
#include<QSlider>
#include<QMediaPlayer>
#include<QDir>StringHelper::StringHelper()
{
audioSource = new QAudioCaptureSource();
capture = new QMediaRecorder(audioSource);QAudioEncoderSettings es; es.setCodec("audio/mp3"); es.setSampleRate(96000); capture->setEncodingSettings(es); capture->setOutputLocation(generateAudioFilePath()); active = false;
}
StringHelper::~StringHelper()
{
delete audioSource;
delete capture;
}void StringHelper::record()
{
capture->record();
active = true;}
void StringHelper::stop()
{capture->stop(); active = false;
setSliderValue(30);(from this code i was able to move the slider and recording is done but i am in need to move the slider by 1 as recording is done in minutes....?????????:(
}
void StringHelper::pause()
{
capture->pause();
}void StringHelper::play()
{
QMediaPlayer *player = new QMediaPlayer;
QUrl url = QUrl::fromLocalFile("myvoice");
player->setMedia(url);
player->setVolume(100);
player->play();}
void StringHelper::setSliderValue(double value)
{
if (value == m_sliderValue)
return;m_sliderValue = value; emit sliderValueChanged(m_sliderValue);
}
QUrl StringHelper::generateAudioFilePath()
{
QDir outputDir(QDir::rootPath());
int lastImage = 0;
int fileCount = 0;
foreach(QString fileName, outputDir.entryList(QStringList() << "myvoice_*")) {
int imgNumber = fileName.mid(5, fileName.size() - 9).toInt();
lastImage = qMax(lastImage, imgNumber);
if (outputDir.exists(fileName))
fileCount += 1;
}
lastImage += fileCount;
QUrl location(QDir::toNativeSeparators(outputDir.canonicalPath() + QString("/myvoice_%1").arg(lastImage + 1, 4, 10, QLatin1Char('0'))));
return location;}
@main.cpp:
@
#include <QtGui/QApplication>
#include <QDeclarativeContext>
#include "qmlapplicationviewer.h"
#include "stringhelper.h"int main(int argc, char *argv[])
{
QApplication app(argc, argv);QmlApplicationViewer viewer; viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto); viewer.setMainQmlFile(QLatin1String("qml/Audio/main.qml")); QDeclarativeContext *context = viewer.rootContext(); StringHelper myclass; context->setContextProperty("StringHelper", &myclass); viewer.showExpanded(); return app.exec();
}
@I have no idea how to link the slider to the button.Could you help me in finding the solution??
Regards,
Harish. -
I have given you a lot of hints already. You have a property to change in your exposed C++ object, and you have a signal in your multi media object. So... perhaps you should create a slot to connect to that multi media objects signal to change the related property? Just give it a try, I am not going to hold your hand every baby step of the way.