单击按钮打开一个对话框

初学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_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 *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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值