Qt学习第三天:QStackedWIdget 堆栈窗体,打开文件,打印文件路径和内容-CSDN博客
堆栈窗体的意思是,将多个窗口叠加,同一时间,用户只能看到一个窗口。
一,实现效果
点击左侧选项右边窗口切换



widget.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QStackedWidget> #include <QHBoxLayout> #include <QListWidget> #include <QDebug> 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);
private: Ui::Widget *ui; QWidget* first_widget; QWidget* second_widget; QWidget* third_widget; QStackedWidget* stacked_widget; QHBoxLayout* hboxlayout; QListWidget* list_widget; }; #endif
|
widget.cpp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| #include "widget.h" #include "ui_widget.h"
Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this);
first_widget = new QWidget; second_widget = new QWidget; third_widget = new QWidget;
first_widget->setStyleSheet("background-color:rgb(255, 0, 0)"); second_widget->setStyleSheet("background-color:rgb(0, 255, 0)"); third_widget->setStyleSheet("background-color:rgb(0, 0, 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))); } Widget::~Widget() { delete ui; }
void Widget::testSlot(int index) { qDebug() << "index:" << index; }
|
二,在上述窗口案例的基础上实现功能:
1,红色窗口可以点击按钮,并弹出打开文本文件的对话框。

widget.h定义
1 2 3 4 5 6 7 8
| #include <QPushButton> #include <QFileDialog>
public slots: void buttonSlot();
private: QPushButton* button;
|
widget.cpp按钮样式与布局
1 2 3 4 5 6 7
| 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);
|
widget.cpp 打开文件的槽函数
鼠标点击QFileDialog按F1可以查看相应的文档
1 2 3 4 5 6 7 8
| void Widget::buttonSlot() { QString file_name = QFileDialog::getOpenFileName(this, tr("Open File"), "/home", tr("text Files (*.c *.cpp *.h *.txt)")); }
|
2,选中文件的话,在绿色窗口打印文件的绝对路径。


widget.h定义
1 2 3 4 5
| #include <QTextEdit> #include <QMessageBox>
private: QLineEdit* edit;
|
widget.cpp文本框样式与布局
1 2 3 4 5
| edit = new QLineEdit(second_widget); edit->setMinimumHeight(80); edit->setStyleSheet("font:35px"); QHBoxLayout* second_layout = new QHBoxLayout(second_widget); second_layout->addWidget(edit);
|
widget.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void Widget::buttonSlot() { 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 { QMessageBox::information(this, "information", "Open file cancel!"); return; } }
|
3,在第二步的基础上,在蓝色窗口打印该文件的所有内容。
widget.h定义
1 2 3 4 5
| #include <QTextEdit> #include <QFile>
private: QTextEdit* text_edit;
|
widget.cpp文本框样式与布局
1 2 3
| text_edit = new QTextEdit(third_widget); QHBoxLayout* third_layout = new QHBoxLayout(third_widget); third_layout->addWidget(text_edit);
|
widget.cpp槽函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| void Widget::buttonSlot() { 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 { QMessageBox::information(this, "information", "Open file cancel!"); return; } QFile file(file_name); if(!file.open(QIODevice::ReadOnly)) { text_edit->append("open file error"); return; } QByteArray data = file.readAll(); text_edit->setText(data); file.close(); }
|