[Solved]Why my defined QAction has no response?



  • Hello, everyone.

    I am a beginner of Qt programming.

    I just make a simple exercise following example "widgets-imageviewer":http://doc.qt.digia.com/latest/widgets-imageviewer.html

    In my program , I made a QAction "rgbFilterAct" under QMenu "processingMenu" , and connected it with function filterRGB(void) to display a RGB range choosing dialogue.

    But it has no response after I click the menu item rgbFilterAct.

    Can anyone kindly tell me why.

    The following is my code.

    @
    // main.cpp//
    #include <QApplication>
    #include "mainwindow.h"
    #include "rgbdlg.h"
    int main(int argc,char **argv)
    {

    QApplication app(argc, argv);
    MainWindow *mwin =new MainWindow();
    mwin->show();
    return app.exec();
    }

    @

    @
    //MainWindow.h
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QMainWindow>
    #include <QtGui>
    #include "rgbdlg.h"

    class MainWindow : public QMainWindow
    {
    Q_OBJECT
    public:
    explicit MainWindow(QWidget *parent = 0);
    QAction *openAct;
    QAction *quitAct;

    QAction *rgbFilterAct;
    
    QMenuBar *menubar;
    
    QMenu *fileMenu;
    QMenu *processingMenu;
    
    QLabel *imgLabel;
    QScrollArea *scrollArea;
    QImage imgsrc,imgdst;
    
    double scaleFactor;
    
    RGBDlg *rgbDlg;
    

    signals:

    public slots:
    void open();
    void save();
    void quit();
    void filterRGB();

    };

    #endif // MAINWINDOW_H

    @

    @
    //MainWindow.cpp
    #include "mainwindow.h"
    #include "rgbdlg.h"
    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
    {
    this->setWindowTitle(tr("Filter image By Color "));

    openAct = new QAction(tr("&Open..."),this);
    quitAct = new QAction(tr("&Quit"),this);
    
    rgbFilterAct = new QAction(tr("&Filter RGB"),this);
    
    this->connect(openAct, SIGNAL(triggered()), this, SLOT(open()));
    this->connect(quitAct, SIGNAL(triggered()), this, SLOT(quit()));
    this->connect(rgbFilterAct,SIGNAL(triggereed()),this,SLOT(filterRGB()));
    
    
    fileMenu = new QMenu(tr("&File"),this);
    fileMenu->addAction(openAct);
    fileMenu->addAction(quitAct);
    
    processingMenu= new QMenu(tr("&Processing"),this);
    processingMenu->addAction(rgbFilterAct);
    
    menubar=new QMenuBar;
    
    menubar->addMenu(fileMenu);
    menubar->addMenu(processingMenu);
    
    imgLabel = new QLabel;
    imgLabel->setBackgroundRole(QPalette::Base);
    imgLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    imgLabel->setScaledContents(true);
    
    scrollArea = new QScrollArea;
    scrollArea->setBackgroundRole(QPalette::Dark);
    scrollArea->setWidget(imgLabel);
    
    this->setMenuBar(menubar);
    this->setCentralWidget(scrollArea);
    
    scaleFactor=1.0;
    rgbDlg=NULL;
    
    this->resize(800,600);
    this->show();
    

    }

    void MainWindow::open(void)
    {
    QString fileName = QFileDialog::getOpenFileName(this,
    tr("Open File"), QDir::currentPath());
    if (!fileName.isEmpty()) {
    QImage imgsrc(fileName);
    if (imgsrc.isNull()) {
    QMessageBox::information(this, tr("FilterImageByColor"),
    tr("Cannot load %1.").arg(fileName));
    return;
    }
    imgdst=imgsrc;
    imgLabel->setPixmap(QPixmap::fromImage(imgdst));
    scaleFactor=1.0;
    imgLabel->resize(imgLabel->pixmap()->size());
    return ;
    }
    return ;
    }

    void MainWindow::save(void)
    {
    return ;
    }

    void MainWindow::quit(void)
    {
    if(QMessageBox::Yes==QMessageBox::question(this,tr("FileterImageByColor"),
    tr("Do you want to really quit program?"),
    QMessageBox::Yes | QMessageBox::No,QMessageBox::No))
    {
    QApplication::quit();
    }
    return;
    }

    void MainWindow::filterRGB(void)
    {
    if(!rgbDlg) {
    rgbDlg = new RGBDlg(this);
    }
    rgbDlg->exec();
    return ;
    }
    @

    @
    //rgbdlg.h
    #ifndef RGBDLG_H
    #define RGBDLG_H

    #include <QDialog>
    #include <QtGUI>
    class RGBDlg : public QDialog
    {
    Q_OBJECT
    public:
    RGBDlg(QWidget *parent = 0);

    signals:

    public slots:

    };

    #endif // RGBDLG_H

    @

    @
    //rgbdlg.cpp
    #include "rgbdlg.h"

    RGBDlg::RGBDlg(QWidget *parent) :
    QDialog(parent)
    {
    }

    @



  • Think so u r using Qt4. Whether the code runs fine without showing any errors?
    I checked the code whether it is running or not.
    But,the code works fine for me.



  • Hi ,

    Welcome to DEVNET,

    If you check line 16 of mainwindow.cpp I think there is a mistake with

    @this->connect(rgbFilterAct,SIGNAL(triggereed()),this,SLOT(filterRGB()));@

    triggered() should be used ,spelling mistake/ you dont have any SIGNAL : triggereed() declaration for RGBDlg.



  • [quote author="gayu" date="1353394688"]Think so u r using Qt4. Whether the code runs fine without showing any errors?
    I checked the code whether it is running or not.
    But,the code works fine for me.[/quote]

    The Project compiles n Runs successfully but for him the QAction is not working . Did you check with the requirements as I see if you click on Processing->Filter RGB it does not open RGBDlg, as there is a spelling mistake for the SIGNAL that he/she is trying to connect.



  • Whether the QAction is not working for him



  • Thank you, Sam

    You are quire right.

    I am sorry for my silly problem. It confused me for a week.

    I really wish the meta object compiler can help much.



  • You are welcome,

    bq. I am sorry for my silly problem.

    No need, we all are here to learn :)

    Kindly Edit your first post and prepend [Solved] to the title.

    Happy Coding !!



  • In my project i also used the same QAction, but when compiling it show some errors.
    Thats y i asked u about the QAction. Will u please tell me about that



  • [quote author="gayu" date="1353399435"]In my project i also used the same QAction, but when compiling it show some errors.
    Thats y i asked u about the QAction. Will u please tell me about that[/quote]

    What errors are you getting ?



  • ERROR
    no matching function for call to ‘QAction::QAction(QString, QPixmap, QString, unsigned int, mainForm* const, const char [8])’



  • And how are you connecting the signals and slots ? Kindly share your code .



  • Ya sure
    The following is the main.cpp file

    @
    #include <qapplication.h>
    #include "mainform.h"

    int main( int argc, char ** argv )
    {
    QApplication a( argc, argv );
    mainForm w;
    w.show();
    a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
    return a.exec();
    }
    @
    The following code is somewhere in the mainform.cpp file

    @
    void mainForm::setupLanguageActions()
    {

    Q3ToolBar *tb = new Q3ToolBar( this );
    tb->setLabel( "Language Actions" );
    Q3PopupMenu *menu = new Q3PopupMenu( this );
    menuBar()->insertItem( tr( "&Language" ), menu );
    
    Q3Action *a;
    a = new Q3Action( tr( "Tamil" ), tr( "&Tamil" ), Qt::CTRL + Qt::Key_Z, this, "langtamil" );
    connect( a, SIGNAL( activated() ), this, SLOT( ChangeLangTamil() ) );
    a->addTo( tb );
    a->addTo( menu );
    
    a = new Q3Action( tr( "Hindi" ), tr( "&Hindi" ), Qt::CTRL + Qt::Key_Y, this, "langhindi" );
    connect( a, SIGNAL( activated() ), this, SLOT( ChangeLangHindi() ) );
    a->addTo( tb );
    a->addTo( menu );
    

    }
    @
    And also for more actions..



  • Are you including the proper header files , Try including QObject header and build.
    Also check for the proper signature of Q3Action class .



  • Might what the question i'm asking is silly, but please tell me
    Whether Qt4 support QAction



  • [quote author="gayu" date="1353403125"]Might what the question i'm asking is silly, but please tell me
    Whether Qt4 support QAction[/quote]

    Ofcourse Qt4 support QAction ,you can have a look in "Porting to Qt 4":http://qt-project.org/doc/qt-4.8/porting4.html#qaction and "QAction":http://qt-project.org/doc/qt-4.8/qaction.html class.

    But why are you still working in Qt 3 ?



  • So when using Q3ToolBar and Q3PopupMenu, their actions must be Q3Actions.
    Otherwise the QAction itself is used right.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.