美文网首页程序员
QT界面编程知识点

QT界面编程知识点

作者: lihaohello | 来源:发表于2018-11-25 14:01 被阅读0次

好资料

0. QT程序打包注意事项

  • 若采用VC编译器,除了应带有QT功能库之外,还应携带VC运行环境dll;
  • VC运行环境dll:msvcp140.dll和vcruntime140.dll,均为32位;

1. 信号和槽

  • 直接定义法(QT4和QT5两种定义方法、代码直接定义和编辑器定义)
/*关于信号的注意事项:
1.所有的信号声明都是公共的,所以Qt规定不能在signals前面加public,private, protected。
2.所有的信号都没有返回值,所以返回值都用void。
3.所有的信号都不需要定义。
4.必须直接或间接继承自QOBject类,并且开头私有声明包含Q_OBJECT。
5.当一个信号发出时,会立即执行其槽函数,等待槽函数执行完毕后,才会执行后面的代码,如果一个信号链接了多个槽,那么会等所有的槽函数执行完毕后才执行后面的代码,槽函数的执行顺序是按照它们链接时的顺序执行的。
6.在链接信号和槽时,可以设置链接方式为:在发出信号后,不需要等待槽函数执行完,而是直接执行后面的代码。
7.发出信号使用emit关键字。
8.信号参数的个数不得少于槽参数的个数。
*/

/*关于槽的注意事项:
1.槽其实就是普通的C++函数,它唯一特点就是能和信号链接。当和它链接的信号被发出时,这个槽就会被调用。
2.声明槽可以使用:public/protected/private slots:
3.以上是Qt4的做法,在Qt5中你也不需要使用这些声明,每个函数都可以被当作是槽函数,而且还可以使用Lambda表达式来作为槽。不过为了程序的可读性,我还是推荐槽函数要声明一下.
*/
connect(pushButton, SIGNAL(clicked()), dialog,  SLOT(close()));
connect(pushButton, QPushButton::clicked, dialog,  QDialog::close);
#include "widget.h"
#include <QLineEdit>
#include <QSignalMapper>
#include<QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{       
    vLayout = new QVBoxLayout(this);
    b1=new QPushButton("模态对话框",this);
    b2=new QPushButton("非模态对话框",this);
    b3=new QPushButton("自定义对话框",this);
    vLayout->addWidget(b1);
    vLayout->addWidget(b2);
    vLayout->addWidget(b3);
    connect(b1,&QPushButton::clicked,[=](){this->close();});
}

Widget::~Widget()
{}
  • 通过对象名关联信号槽(代码手工定义和编辑器定义)
//头文件
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QPushButton>

class Widget : public QWidget
{
    Q_OBJECT
    public:
    Widget(QWidget *parent = 0);
    ~Widget();
    private:
    QPushButton *b1;
    private slots:
    void on_button1_released();
};

#endif // WIDGET_H

//主文件
#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    resize(500,300);
    b1=new QPushButton("CLOSE",this);
    b1->move(200,200);
    b1->setObjectName(QStringLiteral("button1"));
    QMetaObject::connectSlotsByName(this);
}

Widget::~Widget()
{}

void Widget::on_button1_released()
{
    this->close();
}

//总结
b1->setObjectName(QStringLiteral("button1"));       //为对象设置名称
QMetaObject::connectSlotsByName(this);              //启动该功能
void Widget::on_button1_released();                //可以直接写槽函数,则自动关联
  • QSignalMapper批量转发信号
#include "widget.h"

#include <QLineEdit>
#include <QSignalMapper>
#include <QVBoxLayout>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{   
    //创建垂直布局,将垂直布局作为主布局
    QVBoxLayout* vLayout = new QVBoxLayout(this);

    //创建编辑框,用于显示点击按钮的文字,并且文字在右边显示
    QLineEdit* edit = new QLineEdit;
    edit->setAlignment(Qt::AlignRight);
    vLayout->addWidget(edit);//将编辑框加入到垂直布局中

    //创建信号匹配器
    QSignalMapper* signalMapper = new QSignalMapper(this);

    //创建0-9数字键,并都加入到网格布局中
    QGridLayout *gridLayout = new QGridLayout;
    for (int i = 0; i < 10; ++i)
    {
        QString txt = QString::number(i);
        QPushButton *button = new QPushButton(txt);
        connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
        signalMapper->setMapping(button, txt);//将按钮和要发送的字符串配对
        gridLayout->addWidget(button, i / 3, i % 3);//一行显示3列
    }

    //连接配对信号和设置文字槽
    connect(signalMapper, SIGNAL(mapped(QString)),
            edit, SLOT(setText(QString)));

    vLayout->addLayout(gridLayout);
    resize(200, 200);
}
Widget::~Widget()
{}

//总结:三大步骤
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(button, txt);//将按钮和要发送的字符串配对
connect(signalMapper, SIGNAL(mapped(QString)),edit, SLOT(setText(QString)));

2. 模态对话框和非模态对话框

#include "widget.h"
#include <QLineEdit>
#include <QSignalMapper>
#include<QDebug>
#include<QDialog>
#include "customdialog.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{       
    vLayout = new QVBoxLayout(this);
    b1=new QPushButton("模态对话框",this);
    b2=new QPushButton("非模态对话框",this);
    b3=new QPushButton("自定义对话框",this);
    vLayout->addWidget(b1);
    vLayout->addWidget(b2);
    vLayout->addWidget(b3);
    connect(b1,&QPushButton::clicked,[=](){
        //显示模态对话框
        QDialog* dlg = new QDialog(this);
        dlg->setAttribute(Qt::WA_DeleteOnClose);//设置对话框关闭后,自动销毁
        dlg->setWindowModality(Qt::WindowModal);//或者可以使用setModel(true)
        dlg->show();
    });
    connect(b2,&QPushButton::clicked,[=](){
        //显示非模态对话框
        QDialog *modellessDig=new QDialog;
        modellessDig->setWindowTitle("非模态对话框");
        modellessDig->setAttribute(Qt::WA_DeleteOnClose);
        modellessDig->show();
    });
    connect(b3,&QPushButton::clicked,[=](){
        //显示自定义对话框
        CustomDialog *dlg=new CustomDialog(this);
        dlg->setAttribute(Qt::WA_DeleteOnClose);
        int ret = dlg->exec();
        if (ret == QDialog::Accepted)
        {
            qDebug()<<"Accepted!";
        }
        else if (ret == QDialog::Rejected)
        {
            qDebug()<<"Rejected!";
        }
    });
}

Widget::~Widget()
{}

3.标准对话框

//输入对话框
int i = QInputDialog::getInt(this, tr("情况"),tr("几岁毕业"), 25, 16, 100, 1, &ok);
double d = QInputDialog::getDouble(this, tr("工作"),tr("一天挣多少钱"), 1000, 100, 10000, 1, &ok);

QStringList items;
items << tr("王者荣耀") << tr("Dota") << tr("Dota2") << tr("LOL");
bool ok;
QString item = QInputDialog::getItem(this, tr("游戏"),tr("你玩哪一个"), items, 0, false, &ok);

QString text = QInputDialog::getText(this, tr("发展"),tr("想跳槽吗"), QLineEdit::Normal,tr("懒"), &ok);

QString text = QInputDialog::getMultiLineText(this, tr("计划"),tr("下一步怎么做"), "走着瞧", &ok);

//颜色对话框
QColor color = QColorDialog::getColor(Qt::green, this, "选择颜色", QColorDialog::DontUseNativeDialog);

//字体对话框
QFont font =QFontDialog::getFont(&ok,this);

//文件夹对话框:
QString directory = QFileDialog::getExistingDirectory(this,"Get directory:","./");

//文件对话框
QString fileName = QFileDialog::getOpenFileName(this,"Open a file","./","All Files (*);;Text Files (*.txt)");

//打开多个文件对话框
QStringList files = QFileDialog::getOpenFileNames(this,"Open multiple files:","./","All Files (*);;Text Files (*.txt)");

//保存文件对话框
QString fileName = QFileDialog::getSaveFileName(this,tr("Save file:"),"./",tr("All Files (*);;Text Files (*.txt)"));

//提示对话框
qDebug()<<QMessageBox::critical(this, ("危险"), ("修路危险"), ("返回"), ("步行"), ("无视"));
qDebug()<<QMessageBox::information(this, "Notify", "Do you?", "No", "Really no");
qDebug()<<QMessageBox::question(this, ("Question"),("this or that?"),QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);

4. 模板类和工具类

QString
QList
QLinkedList
QVector
QMap
QHash
QVariable

正则表达式

5. 窗口布局

(1) QSplitter

QSplitter小实例

//实例
QSplitter *splitterMain = new QSplitter(Qt::Horizontal, Q_NULLPTR);
QTextEdit *textLeft = new QTextEdit(QObject::tr("Left Widget"),splitterMain);
QTextEdit *textRight = new QTextEdit(QObject::tr("Right Widget"), splitterMain);    
QTextEdit *textRight2 = new QTextEdit(QObject::tr("Right Widget2"), splitterMain);  
splitterMain->setStretchFactor(1, 1);
splitterMain->setWindowTitle(QObject::tr("Splitter"));
splitterMain->show();

//一个QSplitter就是一个窗口QWidget
//setStretchFactor(int index,int factor)用法为关键:设置各个分割窗口的宽度或高度比例
//下面三行代码将设置水平分割窗口的宽度比例
splitterMain->setStretchFactor(0, 1);
splitterMain->setStretchFactor(1, 3);
splitterMain->setStretchFactor(2, 3);
//factor取值为整数,当其值为0表示固定宽度或高度,默认为0

(2) QDockWidget

setWindowTitle("李浩");
QTextEdit *te = new QTextEdit(this);
te->setText("Main Window");
te->setAlignment(Qt::AlignCenter);
setCentralWidget(te);

QDockWidget *dock1 = new QDockWidget("悬浮窗口1", this);
dock1->setFeatures(QDockWidget::DockWidgetMovable);
dock1->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
QTextEdit *te1 = new QTextEdit();
te1->setText("dock1, which can be moded to left or right side");
dock1->setWidget(te1);
addDockWidget(Qt::RightDockWidgetArea, dock1);

QDockWidget *dock2 = new QDockWidget("悬浮窗口2", this);
dock2->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable);
QTextEdit *te2 = new QTextEdit();
te2->setText("dock2, which can be closed and floated");
dock2->setWidget(te2);
addDockWidget(Qt::RightDockWidgetArea, dock2);

QDockWidget *dock3 = new QDockWidget("悬浮窗口3", this);
dock3->setFeatures(QDockWidget::AllDockWidgetFeatures);
QTextEdit *te3 = new QTextEdit();
te3->setText("dock3, all features");
dock3->setWidget(te3);
addDockWidget(Qt::RightDockWidgetArea, dock3);

(3) QStackedWidget

label1 = new QLabel("WindowTest1");
label2 = new QLabel("WindowTest2");
label3 = new QLabel("WindowTest3");
widget = new MyWidget();
stack = new QStackedWidget(this);
stack->addWidget(label1);
stack->addWidget(label2);
stack->addWidget(label3);
stack->addWidget(widget);
stack->setCurrentIndex(1);

(4) 三种基本布局

QHBoxLayout
QVBoxLayout
QGridLayout

6. 中文乱码问题

参考资料

  • QString::fromLocal8Bit(“你好”)
  • QStringLiteral(“中国”)
  • pragma execution_character_set("utf-8") 此法最好呢

相关文章

网友评论

    本文标题:QT界面编程知识点

    本文链接:https://www.haomeiwen.com/subject/dcepqqtx.html