0

I'm new with Qt and having some playing-around with it.

I picked a sample code from "C GUI programming with Qt 4" and cannot find anything incomprehensive about the code but it doesn't run correctly:

** projectfile.pro

QT       += core gui

TARGET = CustomDialog
TEMPLATE = app


SOURCES += main.cpp \
    finddialog.cpp

HEADERS  += \
    finddialog.h

** dialog header:

#ifndef FINDDIALOG_H
#define FINDDIALOG_H

#include <QDialog>

class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;

class FindDialog : public QDialog
{
    Q_OBJECT
public:
    FindDialog(QWidget *parent = 0);

signals:
    void findNext(const QString &str, Qt::CaseSensitivity cs);
    void findPrevious(const QString &str, Qt::CaseSensitivity cs);


private slots:
    void findClicked();
    void enableFindButton(const QString &text);
private:
    QLabel *label;
    QLineEdit *lineEdit;
    QCheckBox *caseCheckBox;
    QCheckBox *backwardCheckBox;
    QPushButton *findButton;
    QPushButton *closeButton;
};

#endif // FINDDIALOG_H

** dialog cpp:

#include <QtGui>
#include "finddialog.h"

 FindDialog::FindDialog(QWidget *parent)
    : QDialog(parent)
 {
     label = new QLabel(tr("Find &what:"));
     lineEdit = new QLineEdit;
     label->setBuddy(lineEdit);
     caseCheckBox = new QCheckBox(tr("Match &case"));
     backwardCheckBox = new QCheckBox(tr("Search &backward"));
     findButton = new QPushButton(tr("&Find"));
     findButton->setDefault(true);

     connect(lineEdit, SIGNAL(textChanged(const QString &)),
             this, SLOT(enableFindButton(const QString &)));
     connect(findButton, SIGNAL(clicked()),
             this, SLOT(findClicked()));
     connect(closeButton, SIGNAL(clicked()),
             this, SLOT(close()));


     QHBoxLayout *topLeftLayout = new QHBoxLayout;
     topLeftLayout->addWidget(label);
     topLeftLayout->addWidget(lineEdit);
     QVBoxLayout *leftLayout = new QVBoxLayout;
     leftLayout->addLayout(topLeftLayout);
     leftLayout->addWidget(caseCheckBox);
     leftLayout->addWidget(backwardCheckBox);
     QVBoxLayout *rightLayout = new QVBoxLayout;
     rightLayout->addWidget(findButton);
     rightLayout->addWidget(closeButton);
     rightLayout->addStretch();
     QHBoxLayout *mainLayout = new QHBoxLayout;
     mainLayout->addLayout(leftLayout);
     mainLayout->addLayout(rightLayout);
     setLayout(mainLayout);
     setWindowTitle(tr("Find"));
     setFixedHeight(sizeHint().height());
 }

 void FindDialog::findClicked()
 {
     QString text = lineEdit->text();
     Qt::CaseSensitivity cs =
             caseCheckBox->isChecked() ? Qt::CaseSensitive
                                       : Qt::CaseInsensitive;
     if (backwardCheckBox->isChecked()) {
         emit findPrevious(text, cs);
     } else {
         emit findNext(text, cs);
     }
 }

 void FindDialog::enableFindButton(const QString &text)
 {
     findButton->setEnabled(!text.isEmpty());
 }

** main.cpp:

#include <QtGui/QApplication>
#include "finddialog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    FindDialog w;
    w.show();

    return a.exec();
}

what's wrong here??

when I click run, no dialog is shown but this error:

enter image description here

6
  • 1
    How does it not run correctly? Does it not compile? What did you expect to happen? Commented Aug 8, 2012 at 6:49
  • i'm using winxp. And the error seems to be OS error or something: "CustomDialog.exe has encountered a problem and needs to close ....." whereas it should have shown me the finddialog according to my codes Commented Aug 8, 2012 at 6:55
  • Debuggers and backtraces are your friends. Commented Aug 8, 2012 at 7:32
  • @Frank Osterfeld: I'm sorry but I don't really get your comment. Could you be a bit clearer?? Commented Aug 8, 2012 at 7:33
  • @Son Le: Run the program in a debugger and have a look at the backtrace. That should give you an indication where the crash happens, and why. If not, paste the backtrace here. Commented Aug 8, 2012 at 7:54

1 Answer 1

3

You have not initialized closeButton. Add

closeButton = new QPushButton(tr("&Close"));

to your constructor (before connecting its signal).

Sign up to request clarification or add additional context in comments.

2 Comments

this is so great! thank you for your help. Why didn't the debugger tell me this :))
in general, it's clear that this kind of bug will show up if there are some uninitialized variables used somewhere in the code. I have the same problem with another project and all of them are fixed properly. Thank you!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.