How to output Debug to Status Bar?
-
Hi, I have this piece of code in my imageviewer.cpp file.
It works correctly and outputs the XY to the console via debug.
How can I output the debug to childStatusBar->showMessage();?void ImageViewer::mouseMoveEvent(QMouseEvent *event){
qDebug() << event->pos();
}The main cpp is:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
ImageViewer imageViewer;
#if defined(Q_OS_SYMBIAN)
imageViewer.showMaximized();
#elseauto childStatusBar = new QStatusBar(&imageViewer); childStatusBar->showMessage("Hi"); imageViewer.setStatusBar(childStatusBar); imageViewer.show();
#endif
return app.exec();
} -
Hi, I have this piece of code in my imageviewer.cpp file.
It works correctly and outputs the XY to the console via debug.
How can I output the debug to childStatusBar->showMessage();?void ImageViewer::mouseMoveEvent(QMouseEvent *event){
qDebug() << event->pos();
}The main cpp is:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
ImageViewer imageViewer;
#if defined(Q_OS_SYMBIAN)
imageViewer.showMaximized();
#elseauto childStatusBar = new QStatusBar(&imageViewer); childStatusBar->showMessage("Hi"); imageViewer.setStatusBar(childStatusBar); imageViewer.show();
#endif
return app.exec();
}@Marxsta3
So does your code show theHi
? If it does, what is the issue/question?You cannot easily redirect
qDebug()
statements to status bar --- though it can be done --- you are supposed to write code to do so rather than usingqDebug()
if you intend messages to be shown there to user. -
@Marxsta3
So does your code show theHi
? If it does, what is the issue/question?You cannot easily redirect
qDebug()
statements to status bar --- though it can be done --- you are supposed to write code to do so rather than usingqDebug()
if you intend messages to be shown there to user.If you want to know what was passed to QStatusBar::showMessage() you can connect to the signal QStatusBar::messageChanged() as shown in the documentation
-
Apologies for the code formatting.
@JonB - yes it outputs "Hi" to the status bar.
@Christian: QStatusbar::messagechanged() - can it capture the output and log it to the status bar, so I have the X, Y coordinates displayed?
Would anyone know the code to achieve this?
-
Apologies for the code formatting.
@JonB - yes it outputs "Hi" to the status bar.
@Christian: QStatusbar::messagechanged() - can it capture the output and log it to the status bar, so I have the X, Y coordinates displayed?
Would anyone know the code to achieve this?
@Marxsta3 said in How to output Debug to Status Bar?:
QStatusbar::messagechanged()
This can only tell you about what is sent to the status bar. That is not your issue. I answered above about sending output to the status bar. You have to send the messages, as your code above does for
Hi
.If you want to send
qDebug()
output there, and you won't change your code (which would be easier), seeqInstallMessageHandler()
, and example at https://stackoverflow.com/questions/4954140/how-to-redirect-qdebug-qwarning-qcritical-etc-output. -
Apologies for the code formatting.
@JonB - yes it outputs "Hi" to the status bar.
@Christian: QStatusbar::messagechanged() - can it capture the output and log it to the status bar, so I have the X, Y coordinates displayed?
Would anyone know the code to achieve this?
I think your question was asked wrong :)
You are asking for how to display yourmouseEvent
position ( x / y ) which you currently show inqDebug()
, in yourQStatusBar
instead, right?
(And not for any general Debug / Message Handler System in your Status Bar)If so:
void ImageViewer::mouseMoveEvent(QMouseEvent *event) { if (someConditionToDisplayText) { QPoint p = event->pos(); QString msg = "( " + QString::number(p.x()) + " / " + QString::number(p.y()) + " )"; statusBar()->showMessage(msg); } }
... assuming
ImageViewer
is aQMainWindow
Code edited after @Bonnie 's hint :)
-
I think your question was asked wrong :)
You are asking for how to display yourmouseEvent
position ( x / y ) which you currently show inqDebug()
, in yourQStatusBar
instead, right?
(And not for any general Debug / Message Handler System in your Status Bar)If so:
void ImageViewer::mouseMoveEvent(QMouseEvent *event) { if (someConditionToDisplayText) { QPoint p = event->pos(); QString msg = "( " + QString::number(p.x()) + " / " + QString::number(p.y()) + " )"; statusBar()->showMessage(msg); } }
... assuming
ImageViewer
is aQMainWindow
Code edited after @Bonnie 's hint :)
@Pl45m4 That code has just one problem,
showMessage
doesn't acceptQPoint
.
So it needs to be converted toQString
first.
If OP's question is how to get theqDebug
output string ofQPoint
, thenQString debugStr; QDebug(&debugStr) << event->pos(); statusBar()->showMessage(debugStr);
-
Thanks @Pl45m4 and @Bonnie.
This worked correctly.QString debugStr; QDebug(&debugStr) << event->pos(); statusBar()->showMessage(debugStr);
In the imageviewer.cpp file I was trying:
void ImageViewer::mouseMoveEvent(QMouseEvent *event) { QString rgbValue; rgbValue = QPixmap().toImage().pixel(mousePosition.x(), mousePosition.y()); QDebug(&rgbValue) << event->pos(); statusBar()->showMessage(rgbValue); }
It seems to be a way to get RGB pixel values and the mouse position in one go? It doesn't work though at the QRgb type conflicts types. Is there an elegant way to get this to work?
I'm going one step at a time but after the RGB part is working the last part of the puzzle is to check if CMYK return CMYK values, if RGB return RGB values. XY coordinates is nice to have.
Based on the code above does anyone have any ideas or code to try? The forum has been invaluable.
-
Thanks @Pl45m4 and @Bonnie.
This worked correctly.QString debugStr; QDebug(&debugStr) << event->pos(); statusBar()->showMessage(debugStr);
In the imageviewer.cpp file I was trying:
void ImageViewer::mouseMoveEvent(QMouseEvent *event) { QString rgbValue; rgbValue = QPixmap().toImage().pixel(mousePosition.x(), mousePosition.y()); QDebug(&rgbValue) << event->pos(); statusBar()->showMessage(rgbValue); }
It seems to be a way to get RGB pixel values and the mouse position in one go? It doesn't work though at the QRgb type conflicts types. Is there an elegant way to get this to work?
I'm going one step at a time but after the RGB part is working the last part of the puzzle is to check if CMYK return CMYK values, if RGB return RGB values. XY coordinates is nice to have.
Based on the code above does anyone have any ideas or code to try? The forum has been invaluable.
@Marxsta3 said in How to output Debug to Status Bar?:
rgbValue = QPixmap().toImage().pixel(mousePosition.x(), mousePosition.y());
What is this line supposed to do? You're creating a default constructed QPixmap - what's the point?
"It doesn't work though at the QRgb type conflicts types" - please show the code causing this and the error message. But I guess you refer to your rgbValue variable of type QString which is of course not compatible with what pixel() returns...
-
@jsulm correct the rgbValue variable of type QString is not compatible with the return type of pixel()
@Marxsta3 said in How to output Debug to Status Bar?:
correct the rgbValue variable of type QString is not compatible with the return type of pixel()
So, construct a QString from QRgb if you need a string.
-
@Pl45m4 That code has just one problem,
showMessage
doesn't acceptQPoint
.
So it needs to be converted toQString
first.
If OP's question is how to get theqDebug
output string ofQPoint
, thenQString debugStr; QDebug(&debugStr) << event->pos(); statusBar()->showMessage(debugStr);
-
The following doesn't give any cast issues. Just have to define mouse position.
void ImageViewer::mouseMoveEvent(QMouseEvent *event) { QString rgbValue; rgbValue = QPixmap().toImage().pixel(mousePosition.x(), mousePosition.y()); QDebug(&rgbValue) << event->pos(); statusBar()->showMessage(rgbValue); }
-
The following doesn't give any cast issues. Just have to define mouse position.
void ImageViewer::mouseMoveEvent(QMouseEvent *event) { QString rgbValue; rgbValue = QPixmap().toImage().pixel(mousePosition.x(), mousePosition.y()); QDebug(&rgbValue) << event->pos(); statusBar()->showMessage(rgbValue); }
@Marxsta3 said in How to output Debug to Status Bar?:
The following doesn't give any cast issues. Just have to define mouse position.
Why
mousePosition
?
You can simply useevent->pos().x()
(andy()
) to get the single mouse coordinates fromevent
as shown in my edited code.
This also doesn't involveQDebug
... if you don't want to print your mouse position anymore at some point, because... well.. you should see it in yourQStatusBar
now :) -
Thanks @Pl45m4 - I'm now trying to do two things at once.
Return the RGB value of a pixel point and it's XY coordinate.
This compiles but receiving the message:QImage::pixel: coordinate (207,201) out of range.
Any thoughts on the structure of the code?void ImageViewer::mouseMoveEvent(QMouseEvent *event) { QString rgbValue; QPointF mousePosition = event->pos(); rgbValue = QPixmap().toImage().pixel(mousePosition.x(), mousePosition.y()); QDebug(&rgbValue) << event->pos(); statusBar()->showMessage(rgbValue); }
-
Thanks @Pl45m4 - I'm now trying to do two things at once.
Return the RGB value of a pixel point and it's XY coordinate.
This compiles but receiving the message:QImage::pixel: coordinate (207,201) out of range.
Any thoughts on the structure of the code?void ImageViewer::mouseMoveEvent(QMouseEvent *event) { QString rgbValue; QPointF mousePosition = event->pos(); rgbValue = QPixmap().toImage().pixel(mousePosition.x(), mousePosition.y()); QDebug(&rgbValue) << event->pos(); statusBar()->showMessage(rgbValue); }
@Marxsta3
Just read the message and look at your code (nothing wrong with its "structure"). This can presumably only mean that the position, (207,201) is out of the bounds ofQPixmap().toImage()
.Which is hardly surprising, since
QPixmap()
is an emptyQPixmap
! If you want to look at mouse position on some pixmap you have, then look at that pixmap! -
Thanks @Pl45m4 - I'm now trying to do two things at once.
Return the RGB value of a pixel point and it's XY coordinate.
This compiles but receiving the message:QImage::pixel: coordinate (207,201) out of range.
Any thoughts on the structure of the code?void ImageViewer::mouseMoveEvent(QMouseEvent *event) { QString rgbValue; QPointF mousePosition = event->pos(); rgbValue = QPixmap().toImage().pixel(mousePosition.x(), mousePosition.y()); QDebug(&rgbValue) << event->pos(); statusBar()->showMessage(rgbValue); }
@Marxsta3 said in How to output Debug to Status Bar?:
QImage::pixel: coordinate (207,201) out of range.
Any thoughts on the structure of the code?Fill your Pixmap with data, like
void ImageViewer::mouseMoveEvent(QMouseEvent *event) { QString rgbValue; QPointF mousePosition = event->pos(); QPixmap pix(200, 200); // set some size pix.fill(Qt::blue); rgbValue = pix.toImage().pixel(mousePosition.x(), mousePosition.y()); QDebug(&rgbValue) << event->pos(); statusBar()->showMessage(rgbValue); }
Also, you need to show it somewhere in order to get the actual sync'ed pixel value. Then you don't have to deal with "out of bound" issues since you are only moving on your image
Currently you are moving your mouse over an empty window while checking this specific mouse position in your image or am I missing something? -
Tried a few changes and still get the out of range notification.
Will continue testing.Reading:
https://www.qtcentre.org/threads/40754-Grab-the-color-of-a-pixel-of-the-screen -
Tried a few changes and still get the out of range notification.
Will continue testing.Reading:
https://www.qtcentre.org/threads/40754-Grab-the-color-of-a-pixel-of-the-screen@Marxsta3
For your code to make any sense/be useful you must have someQPixmap
somewhere outside ofmouseMoveEvent
which the mouse is moving over and for which you want to look at a pixel. No point you creating a pixmap in this method presumably. Just use whichever existing pixmap the mouse is moving over here, nothing to "try" or "test".