Qt中QStackedWIdget 堆栈窗体

堆栈窗体的意思是,将多个窗口叠加,同一时间,用户只能看到一个窗口。

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QStackedWidget>
#include <QHBoxLayout>
#include <QListWidget>
#include <QDebug>
#include <QPushButton>
#include <QLineEdit>
#include <QFileDialog>
#include <QMessageBox>
#include <QTextEdit>
#include <QFile>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
public slots:
    void testSlot(int index);
    void buttonSlot();
private:
    Ui::Widget *ui;

    QWidget* first_widget;
    QWidget* second_widget;
    QWidget* third_widget;

    QListWidget* list_widget;
    QHBoxLayout* hboxlayout;
    QStackedWidget* stacked_widget;
    QPushButton* button;
    QLineEdit* edit;
    QTextEdit* text_edit;
    QFileDialog* file_name;

};
#endif // WIDGET_H


widget.cpp:


#include "widget.h"
#include "ui_widget.h"

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

    // first_widget
    first_widget = new QWidget;

	// 控件在实例化时,一般来说在构造函数里,添加指定的窗口,之前都是填写this,这一次我们也可以将控件放置在独立的其他窗口上。
    button = new QPushButton("Select File", first_widget);
    button->setMinimumHeight(80);
    button->setStyleSheet("font:35px");

	// 在堆栈窗体的子窗口上,添加布局。
    QHBoxLayout* first_layout = new QHBoxLayout(first_widget);
    first_layout->addWidget(button);

    // second_widget
    second_widget = new QWidget;

    edit = new QLineEdit(second_widget);
    edit->setMinimumHeight(80);
    edit->setStyleSheet("font:35px");

    QHBoxLayout* second_layout = new QHBoxLayout(second_widget);
    second_layout->addWidget(edit);

    // third_widget
    third_widget = new QWidget;

    text_edit = new QTextEdit(third_widget);
    QHBoxLayout* third_layout = new QHBoxLayout(third_widget);
    third_layout->addWidget(text_edit);

    first_widget->setStyleSheet("background-color:rgb(245, 160, 160)");
    second_widget->setStyleSheet("background-color:rgb(227, 252, 143)");
    third_widget->setStyleSheet("background-color:rgb(140, 213, 255)");

    stacked_widget = new QStackedWidget(this);
    stacked_widget->addWidget(first_widget);
    stacked_widget->addWidget(second_widget);
    stacked_widget->addWidget(third_widget);

    list_widget = new QListWidget(this);
    list_widget->addItem("red widget");
    list_widget->addItem("green widget");
    list_widget->addItem("blue widget");

    hboxlayout = new QHBoxLayout(this);
    hboxlayout->addWidget(list_widget);
    hboxlayout->addWidget(stacked_widget);

    hboxlayout->setStretchFactor(list_widget, 1);
    hboxlayout->setStretchFactor(stacked_widget, 5);

    connect(list_widget, SIGNAL(currentRowChanged(int)),
            this, SLOT(testSlot(int)));
    connect(list_widget, SIGNAL(currentRowChanged(int)),
            stacked_widget, SLOT(setCurrentIndex(int)));
    connect(button, SIGNAL(clicked()),
            this, SLOT(buttonSlot()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::testSlot(int index)
{
    qDebug() << "index:" << index;
}

void Widget::buttonSlot()
{
	// 使用QFileDialog打开Qt的文件对话框
	// 如果点击了取消cancel,则返回值为空字符串
	// 如果点击了指定的文件,则将返回该文件的绝对路径
    QString file_name = QFileDialog::getOpenFileName(this,
         tr("Open File"), "/home", tr("text Files (*.c *.cpp *.h *.txt)"));

	// 判断字符串是否为空串
    if(!file_name.isEmpty())
    {
        edit->setText(file_name);
    }
    else
    {
		// Qt的消息盒子,提供了方法可以弹出一个小的提示对话框。
        QMessageBox::information(this, "information", "Open file cancel!");
        return;
    }

	// Qt的文件读写操作,都是可以利用QFile对象实现的。QFile类似于C语言当中FILE*指针
	// 实例化QFIle对象时,需要指定文件的绝对路径。
    QFile file(file_name);
    
    // 利用open函数打开指定路径的文件,有可能会打开失败,需要提取判断返回值的bool数值
    // 打开的模式,需要选择具体的读写方式,这里只设计只读操作,所以用QIODevice::ReadOnly即可。
    if(!file.open(QIODevice::ReadOnly))
    {
        text_edit->append("open file error");
        return;
    }

	// 打开文件成功之后,利用readAll读取该文件的所有内容,并且返回一个QByteArray类型的数据。
	// QByteArray意思是字节数组。每个元素的大小为1字节,所以也可以看成是unsigned char[]数组的二次封装。
    QByteArray data = file.readAll();

	// 将所有的文本信息添加到textEdit里面去。
    text_edit->setText(data);

	// 结束代码逻辑时关闭文件。
    file.close();
}

以上代码实现了的功能是可以实现一个堆栈窗体,我们运行

结果如下red widget界面选择文件

选择好文件之后点击green widget会显示文件的绝对路径

点击bule widget会显示你选择打开文件的内容

 详细功能请详细看代码解读

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值