单击按钮打开一个对话框

来源:互联网 发布:阿里云域名几级 编辑:程序博客网 时间:2024/06/02 02:06

初学Qt,想在主窗口(QWidget)中单击一个按钮(QPushButton)时打开 一个对话框(QDialog)。

我使用的环境为:

Qt    版本:5.6.2  非商业版    Qt Creator  版本:4.0.3

最初的代码如下:

main.cpp

#include <QApplication>#include <QPushButton>#include <QHBoxLayout>#include "finddialog.h"void btnSearchClick();int main(int argc, char *argv[]){    QApplication app(argc, argv);    QWidget *winMain = new QWidget;    winMain->setWindowTitle("Open Dialog");    QPushButton *btnQuit = new QPushButton(QObject::tr("Quit"));    QObject::connect(btnQuit, SIGNAL(clicked()),&app, SLOT(quit()));    QPushButton *btnSearch = new QPushButton(QObject::tr("Search"));    QObject::connect(btnSearch, SIGNAL(clicked), &app, SLOT(btnSearchClick()));    QVBoxLayout *mainLayout = new QVBoxLayout;    mainLayout->addWidget(btnSearch);    mainLayout->addWidget(btnQuit);    winMain->setLayout(mainLayout);    winMain->show();    return app.exec();}void btnSearchClick() {    FindDialog *dlgFind = new FindDialog;    dlgFind->show();}下面finddialog.h和finddialog.cpp的代码取自于《C++ GUI Qt4编程》(第二版)(Jasmin、Mark著,闫锋欣等译 电子工业出版社) 

finddialog.h代码:
#ifndef FINDDIALOG_H#define FINDDIALOG_H#include <QDialog>class QCheckBox;class QLabel;class QLineEdit;class QPushButton;class FindDialog : public QDialog {    Q_OBJECTpublic:    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 *lbFindWhat;    QLineEdit *edtFindStr;    QCheckBox *caseCheckBox;    QCheckBox *backwardCheckBox;    QPushButton *btnFind;    QPushButton *btnClose;};#endif // FINDDIALOG_H


finddialog.cpp代码:
#include <QtWidgets>#include "finddialog.h"FindDialog::FindDialog(QWidget *parent) : QDialog(parent) {    lbFindWhat = new QLabel(tr("Find &what:"));    //lbFindWhat = new QLabel;    lbFindWhat->setText(tr("Find &what"));    edtFindStr = new QLineEdit;    lbFindWhat->setBuddy(edtFindStr);    caseCheckBox = new QCheckBox(tr("Match &case"));    backwardCheckBox = new QCheckBox(tr("Search &backward"));    btnFind = new QPushButton(tr("&Find"));    btnFind->setDefault(true);    btnFind->setEnabled(false);    btnClose = new QPushButton(tr("Close"));    connect(edtFindStr, SIGNAL(textChanged(const QString &)), this, SLOT(enableFindButton(const QString &)));    connect(btnFind, SIGNAL(clicked()), this, SLOT(findClicked()));    connect(btnClose, SIGNAL(clicked()), this, SLOT(close()));    QHBoxLayout *topLevelLayout = new QHBoxLayout;    topLevelLayout->addWidget(lbFindWhat);    topLevelLayout->addWidget(edtFindStr);    QVBoxLayout *leftLayout = new QVBoxLayout;    leftLayout->addLayout(topLevelLayout);    leftLayout->addWidget(caseCheckBox);    leftLayout->addWidget(backwardCheckBox);    QVBoxLayout *rightLayout = new QVBoxLayout;    rightLayout->addWidget(btnFind);    rightLayout->addWidget(btnClose);    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 = edtFindStr->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) {    btnFind->setEnabled(!text.isEmpty());}

但是在执行时,单击按钮btnSearch没有反应,而且报出“app没有槽btnSearchClick”(不是精确的错误信息,大意如此)。

我知道肯定是我的匹配“信号-槽”connect没有写对,即main中的“QObject::connect(btnSearch, SIGNAL(clicked), &app, SLOT(btnSearchClick()));”有问题。

在网上也找了很久,但没有解决问题。后来看到CSDN上一个大侠(“shen_wei”)的一段话:“推荐你去看看Qt自带的例子。。这样你能学习的更多!!”,很有启发。找来找去,还是老老实实看Qt自带的例子吧。终于在“Examples\Qt-5.6\widgets\dialogs\findfiles”中找到答案。

只要把“QObject::connect(btnSearch, SIGNAL(clicked), &app, SLOT(btnSearchClick()));”修改下面的语句即可:

QObject::connect(btnSearch, &QAbstractButton::clicked, &app, &btnSearchClick);

也就是不使用SIGNAL和SLOT宏。

修改后,运行结果正确,正是我想要的结果。



0 0
原创粉丝点击