Qt學習記錄1

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章