Qt/Qt Designer (Version 3.x) GUI questions
-
All,
I have made the switch to Qt 4. However, I have scoured over Qt , TrollTech and Nokia pages, examples and web search resources to to attempt finding a Qt4 example tied to my application and I simply cannot find one.
I am in urgent need of a simple example showing the following (hand-code C++ would be OK):
-
A widget (on top) where a GIF file can be loaded and displayed within it (the GIF files are externally crafted, so that's not a problem)
-
Two push-buttons (below the widget in 1) ) horizontally placed. Each push-button loads a separate GIF:
- push-button 1 loads GIF # 1 in 1)
- push-button 2 loads GIF # 2 in 1)
Eddy: You mentioned using QSignalMapper in Qt 4 with setIcon and the smarts on QString to find the right GIF files. I cant' seem to locate it in the examples section of Qt 4. Can you show me a really simple example or send me the code you refer to ?
All: I really need your help.
Thank you very much,
Qt-Newbie
-
-
this is the "link":http://doc.qt.nokia.com/4.7/qsignalmapper.html#details I gave you. It still works ;)
I know it's not exactly what you want to do but it gives you a good start.What do you have so far?
-
consider the following:
@
//in mylabel.h
class MyLabel : public QLabel
{
Q_OBJECTpublic slots:
void setFileName(QString name)
{
setPixmap(name);
}
};//in main.cpp
int main(int argc, char *argv[])
{
QApplication app(argc, argv);QSignalMapper mapper; MyLabel label; QPushButton b1; QPushButton b2; mapper.setMapping(&b1,"gif1.gif"); mapper.setMapping(&b2,"gif2.gif"); QObject::connect(&b1,SIGNAL(clicked()),&mapper,SLOT(map())); QObject::connect(&b2,SIGNAL(clicked()),&mapper,SLOT(map())); QObject::connect(&mapper,SIGNAL(mapped(QString)),&label,SLOT(setFileName(QString))); label.show(); return app.exec();
}
@
-
Eddy, Loladiro,
Thanks very much for your replies.
Loladiro: I will start with your code and let you know how I fare.
Qt-Newbie
-
Loladiro,
I took your code and made some mods to it so that it would compile without errors using Qt 4.2.1. Here they are:
- mylabel.h
@
#ifndef MYLABEL_H
#define MYLABEL_H#include <QLabel>
//in mylabel.h
class MyLabel : public QLabel
{
Q_OBJECTpublic slots:
void setFileName(QString name)
{
setPixmap(name);
}
};#endif
@- Also, made some mods to main.cpp:
@
#include <QApplication>
#include <QSignalMapper>
#include <QPushButton>#include "mylabel.h"
//in main.cpp
int main(int argc, char *argv[])
{
QApplication app(argc, argv);QSignalMapper mapper; MyLabel label; QPushButton b1; QPushButton b2; mapper.setMapping(&b1,"gif1.gif"); mapper.setMapping(&b2,"gif2.gif"); QObject::connect(&b1,SIGNAL(clicked()),&mapper,SLOT(map())); QObject::connect(&b2,SIGNAL(clicked()),&mapper,SLOT(map())); QObject::connect(&mapper,SIGNAL(mapped(QString)),&label,SLOT(setFileName(QString))); label.show(); return app.exec();
}
@When I run the executable, I get a very small window. When I expand it, I am getting a pure grey background: No pushbuttons. No gifs displayed. Nothing.
Please help.
Thanks,
Qt-Newbie -
I though you would incorporate it into existing code, my mistake:
@
int main(int argc, char *argv[])
{
QApplication app(argc, argv);QWidget mainWidget; QSignalMapper mapper; MyLabel label; QPushButton b1(&mainWidget); QPushButton b2(&mainWidget); mapper.setMapping(&b2,"gif2.gif"); mapper.setMapping(&b2,"gif2.gif"); QObject::connect(&b1,SIGNAL(clicked()),&mapper,SLOT(map())); QObject::connect(&b2,SIGNAL(clicked()),&mapper,SLOT(map())); QObject::connect(&mapper,SIGNAL(mapped(QString)),&label,SLOT(setFileName(QString))); QVBoxLayout verticalLayout(&mainWidget); verticalLayout.addWidget(&label); QHBoxLayout horizontalLayout(&mainWidget); horizontalLayout.addWidget(&b1); horizontalLayout.addWidget(&b2); verticalLayout.addLayout(&horizontalLayout); mainWidget.show(); return app.exec();
}
@ -
You're never calling show() on your buttons.
While, ideally, all the widgets should be children of another parent widget with a layout, etc., the code you have is sufficient to test out the mechanics of the QSignalMapper, but you currently need to show each widget.
Edit: Nevermind. You figured it out. :-)
-
All,
The example worked ! Thank you all for your notes.
I have further questions:
- The worked out example indicates the ability to do the sequence:
Push a Button --> signal/slot --> map a GIFn file --> display GIFn in mylabel
What I would need to do is:
a) Push a Button --> Query an interface --> Receive reply from interface --> signal/slot/map a GIF file based on interface reply --> display GIF in mylabel
Where would I put the stub code to accomplish this ? Is there a Qt 4 solution ?
b) Can I make system call functions in Qt 4 ? I am talking a "system()" type call to a Python 2.4 script I have already developed.
Please reply.
Thank you all,
Qt-Newbie
- The worked out example indicates the ability to do the sequence:
-
[quote]
Push a Button —> Query an interface —> Receive reply from interface —> signal/slot/map a GIF file based on interface reply —> display GIF in mylabelWhere would I put the stub code to accomplish this ? Is there a Qt 4 solution ?
[/quote]
A little bit trickier, but like:
@class MyMainWindow
{
QLabel *label;public slots:
void buttonClicked(int nr)
{
label->setPixmap(queryInterface(nr));
}
};//and the button creation like:
for(int i = 0; i < maxButtons; ++i)
{
QPushButton *b = new QPushButton(this);
mapper.setMapping(b,i);
connect(b,SIGNAL(clicked()),&mapper,SLOT(map()));
myLayout->addWidget(b);
}@
Depending on how long it takes to query the interface, you might want to have a separate, slot to set the image that is being called once the interface is done.
[quote]
b) Can I make system call functions in Qt 4 ? I am talking a “system()” type call to a Python 2.4 script I have already developed.
[/quote]Have a look at "QProcess":http://doc.qt.nokia.com/latest/qprocess.html
DISCLAIMER: The code shown is a use case example and neither complete nor intended for direct use in an application.
-
All,
How do I place text inside the pushbuttons ? I do not see any methods with the QPushButton class. Is it inherited ?
Please reply.
Thanks,
Qt-Newbie -
Yes, from "QAbstractButton":http://doc.qt.nokia.com/latest/qabstractbutton.html
-
Loladiro,
Thanks. I got the button text labels via the QAbstractButton class.
Please explain where "queryInterface(nr)" is defined. I am a bit confused. Do I need to write a class/method for this ? Is it a wrapper ?
Thanks,
Qt-Newbie -
[quote author="qt-newbie" date="1313106592"]Loladiro,
Thanks. I got the button text labels via the QAbstractButton class.
Please explain where "queryInterface(nr)" is defined. I am a bit confused. Do I need to write a class/method for this ? Is it a wrapper ?
Thanks,
Qt-Newbie[/quote]Since I have no idea what kind of interface you have I just put it there to indicate where you have to query your interface.