您的位置:首页 > 编程语言 > Qt开发

Qt学习记录1

2015-05-22 15:10 162 查看
一个实现在LineEdit框中输入内容 在textBrowser框输出内容的程序

源码:

//widget.h#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QTextBrowser>
#include <QPushButton>
#include <QString>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

public:
explicit Widget(QWidget *parent = 0);
~Widget();

signals:

private slots:
<span style="color:#ff0000;">void savedata();</span>

private:
Ui::Widget *ui;
QLabel *label1;
QLabel *label2;
QLineEdit *lineedit;
QTextBrowser *textbrowser;
QPushButton *button;
QPushButton *cancel;
QString str;

};

#endif // WIDGET_H
原本是按照书中介绍的那样使用前置声明 
class QLabel;
class QLineEdit;
class QTextBrowser;
class QPushButton;
class QString;
但是由于是qt4的书,所以Qt5貌似不支持的样子,所以就直接包含头文件。这个问题以后再关注吧。

自定义了一个槽,savedata();用于保存lineedit输入的数据并在textbrowser中输出。名字起的是不是不好。。。

//widget.cpp#include "widget.h"
#include "ui_widget.h"
#include <QHBoxLayout>
#include <QVBoxLayout>

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);

//标签与行编辑的定义
label1 = new QLabel(tr("&Input:"));
lineedit = new QLineEdit;
label1->setBuddy(lineedit);

//标签与现实框的定义
label2 = new QLabel(tr("&Show:"));
textbrowser = new QTextBrowser;
label2->setBuddy(textbrowser);

//输入按钮的定义
button = new QPushButton(tr("&OK"));
cancel = new QPushButton(tr("&CANCEL"));
cancel->setShortcut(Qt::Key_Escape);
//设置快捷键
button->setShortcut(Qt::Key_Enter);//设置快捷键小键盘的enter键
button->setShortcut(Qt::Key_Return);//设置快捷键字母键盘的enter键
<span style="color:#ff0000;">//button->setDefault(true);//使该按钮成为默认按钮   即按下enter时默认按下</span>

//signal_slot
connect(cancel,SIGNAL(clicked()),
this,SLOT(close()));
<span style="color:#3366ff;">connect(button,SIGNAL(clicked()),
this,SLOT(savedata()));</span>
connect(button,SIGNAL(clicked()),
lineedit,SLOT(clear()));//清空lineedit中的数据

//布局
QHBoxLayout *toplayout = new QHBoxLayout;
toplayout->addWidget(label1);
toplayout->addWidget(lineedit);
toplayout->addWidget(button);

QHBoxLayout *middlelayout = new QHBoxLayout;
middlelayout->addWidget(label2);
middlelayout->addStretch();//添加一个分隔符(伸展器)
middlelayout->addWidget(cancel);

QVBoxLayout *alllayout = new QVBoxLayout;
alllayout->addLayout(toplayout);
alllayout->addLayout(middlelayout);
alllayout->addWidget(textbrowser);

setLayout(alllayout);//将全布局安装在Widget中

setWindowTitle(tr("ioput"));

setFixedHeight(sizeHint().height());//返回一个窗口理想的大小
}

<span style="color:#009900;">void Widget::savedata()</span>
{
str = lineedit->text();  //把lineedit中的文本赋给str
textbrowser->append(str);//在textbrowser中显示str的内容
lineedit->setFocus();    //设置焦点

}

Widget::~Widget()
{
delete ui;
}
红色显示的是设置默认按enter键使按下button按钮,但是实际测试中却没起作用,同样是在qt4教程中学到的,可能已经过时了吧。所以改用setShorcut();函数来设置快捷键。

绿色的在widget.h中定义的槽。

<span style="color:#3366ff;">connect(button,SIGNAL(clicked()),
this,SLOT(savedata()));</span>这一句原本是错的,this改成textbrowser了,但是一直没找到问题,最后请教一位高人才解决,在此感谢@独家废物 兄。

signal_slot或signal_signal这样的关联,要求二者拥有相同的参数列表。若SIGNAL参数比SLOT的多,则多的自动忽略。这个我之前就看过,可看过不代表就记得。原本,我用到信号是:

<span style="font-size:18px;"><strong> connect(button,SIGNAL(clicked()),
textbrowser,SLOT(setText(str)));</strong></span>其中信号没参数,而槽中却有一个参数,所以不能完成。而我一直没发现,现在记忆深刻。


最后,我把程序名字起为ioput,意为:i:in,o:out,即in_output,输入输出程序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: