一個實現在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,輸入輸出程序。