Qt记录之QTabWidget的使用

记录一下QTabWidget的一次使用

QTabWidget实现出来效果就是标签页的界面,点击一个标签,主界面就展现那个标签页的东西。

值得注意的就是以下几点:

1.QTabWidget::addTab(Widget,"title"),增加一个标签页。比如这个Widget为QPushButton,那个增加的标签页一整页就是一个按钮。

2.QTabWidget::setLayout(Layout),这样设置,所有标签页也是这个布局了,要是Layout上有Widget,那么所有标签页都展示Layout上的Widget了。

3.例子里面,第一个标签页是Widget就是一个新建的QWidget类,要添加组件,就给这个Widget设置一个Layout,然后添加Widget到Layout上即可。第二个标签页是QListWidget,会自己读取目录,然后把目录中的文件,文件夹展示出来。

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QWidget>
#include <QTabWidget>
#include<QListWidgetItem>
#include<QListWidget>
#include<QDir>
#include<QEvent>
#include<QMenu>
#include<QFileSystemWatcher>
#include<QInputDialog>
#include<QDesktopServices>
#include<iostream>
#include<QApplication>
#include<QDesktopWidget>
#include<QLabel>
#include<QToolButton>
#include<QPushButton>
#include<QGridLayout>
#include<QGroupBox>
#include<QLineEdit>
#include<QListWidget>
#include<QListWidgetItem>
#include<QFileInfoList>
#include<QDir>
#include<QDebug>
#include<QFileDialog>
#include<QMessageBox>

#define QS(x) QString::fromLocal8Bit((x))
#define sQS(x) QString::fromLocal8Bit((x).data())
#define toStr(x) string(x.toLocal8Bit())
#define qsTQS(x) QUrl::fromLocalFile(x).toString()//.remove(0,8)
#define qsurlTQS(x) QUrl::fromLocalFile(x).url().remove(0,8)

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void chooseDir();
    void chooseDirFromCurrentDir();
    void finishCommit();
    void slotDirShow(QListWidgetItem*);
    void renameFile();
    void deleteFile();
    void copyFile();
    void openFile();
    void showFiledir();

private:
    QTabWidget* m_tabUI;
    bool m_showTab1;
    bool m_showTab2;
    bool m_showTab3;
    bool m_showTab4;
    bool m_showTab5;
    QListWidget* file;
    QDir* dir;
    QMenu* menu;
    QFileSystemWatcher* watcher;

protected:
    bool Widget::eventFilter(QObject *watched, QEvent *event);
};
#endif // WIDGET_H

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->setWindowTitle("Tools");
    this->setWindowFlags(Qt::Widget|Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
    const int w = 400, h = 350;
    const int x = (QApplication::desktop()->width() - w) >> 1;
    const int y = (QApplication::desktop()->height() - h) >> 1;
    this->setGeometry(x, y, w+40, h+20);

    m_tabUI = new QTabWidget(this);
    m_tabUI->setGeometry(x-460,y-200,w,h);
    m_tabUI->show();
    m_showTab1 = true;
    m_showTab2 = false;
    m_showTab3 = false;
    m_showTab4 = false;
    m_showTab5 = true;
    if(m_showTab1)
    {
        QWidget* ui2Trans = new QWidget();

        m_tabUI->addTab(ui2Trans,QS("Tab1"));


        QGridLayout* mainLayout1 = new QGridLayout();


        QGroupBox* box1 = new QGroupBox(QS("box1"));
        QGridLayout* layout1 = new QGridLayout();
        QLabel* label = new QLabel(QS("请选择文件:"));
        QLineEdit* lineEdit = new QLineEdit();
        QPushButton* pushButton_open = new QPushButton(QS("打开目录"));
        connect(pushButton_open,SIGNAL(clicked(bool)),this,SLOT(chooseDir()));
        QPushButton* pushButton_choose = new QPushButton(QS("选择"));
        connect(pushButton_choose,SIGNAL(clicked(bool)),this,SLOT(chooseDirFromCurrentDir()));
        QPushButton* pushButton_trans = new QPushButton(QS("信息框"));
        connect(pushButton_trans,SIGNAL(clicked(bool)),this,SLOT(finishCommit()));

        layout1->addWidget(label,0,0);
        layout1->addWidget(lineEdit,0,1);
        layout1->addWidget(pushButton_open,0,3);
        layout1->addWidget(pushButton_choose,0,5);
        layout1->addWidget(pushButton_trans,0,7);


        box1->setLayout(layout1);
        mainLayout1->addWidget(box1,0,0);


        QGroupBox* box2 = new QGroupBox(QS("box2"));
        QGridLayout* layout2 = new QGridLayout();
        QLabel* label_2 = new QLabel(QS("请选择文件:"));
        QLineEdit* lineEdit2 = new QLineEdit();
        QPushButton* pushButton_open2 = new QPushButton(QS("打开目录"));
        connect(pushButton_open2,SIGNAL(clicked(bool)),this,SLOT(chooseDir()));
        QPushButton* pushButton_choose2 = new QPushButton(QS("选择"));
        connect(pushButton_choose2,SIGNAL(clicked(bool)),this,SLOT(chooseDirFromCurrentDir()));
        QPushButton* pushButton_trans2 = new QPushButton(QS("信息框"));
        connect(pushButton_trans2,SIGNAL(clicked(bool)),this,SLOT(finishCommit()));

        layout2->addWidget(label_2,0,0);
        layout2->addWidget(lineEdit2,0,1);
        layout2->addWidget(pushButton_open2,0,3);
        layout2->addWidget(pushButton_choose2,0,5);
        layout2->addWidget(pushButton_trans2,0,7);


        box2->setLayout(layout2);
        mainLayout1->addWidget(box2,1,0);



        QGroupBox* box3 = new QGroupBox(QS("box3"));
        QGridLayout* layout3 = new QGridLayout();
        QLabel* label_3 = new QLabel(QS("请选择文件:"));
        QLineEdit* lineEdit3 = new QLineEdit();
        QPushButton* pushButton_open3 = new QPushButton(QS("打开目录"));
        connect(pushButton_open3,SIGNAL(clicked(bool)),this,SLOT(chooseDir()));
        QPushButton* pushButton_choose3 = new QPushButton(QS("选择"));
        connect(pushButton_choose3,SIGNAL(clicked(bool)),this,SLOT(chooseDirFromCurrentDir()));
        QPushButton* pushButton_trans3 = new QPushButton(QS("信息框"));
        connect(pushButton_trans3,SIGNAL(clicked(bool)),this,SLOT(finishCommit()));

        layout3->addWidget(label_3,0,0);
        layout3->addWidget(lineEdit3,0,1);
        layout3->addWidget(pushButton_open3,0,3);
        layout3->addWidget(pushButton_choose3,0,5);
        layout3->addWidget(pushButton_trans3,0,7);


        box3->setLayout(layout3);
        mainLayout1->addWidget(box3,2,0);


        QGroupBox* box4 = new QGroupBox(QS("box4"));
        QGridLayout* layout4 = new QGridLayout();
        QLabel* label_4 = new QLabel(QS("请选择文件:"));
        QLineEdit* lineEdit4 = new QLineEdit();
        QPushButton* pushButton_open4 = new QPushButton(QS("打开目录"));
        connect(pushButton_open4,SIGNAL(clicked(bool)),this,SLOT(chooseDir()));
        QPushButton* pushButton_choose4 = new QPushButton(QS("选择"));
        connect(pushButton_choose4,SIGNAL(clicked(bool)),this,SLOT(chooseDirFromCurrentDir()));
        QPushButton* pushButton_trans4 = new QPushButton(QS("信息框"));
        connect(pushButton_trans4,SIGNAL(clicked(bool)),this,SLOT(finishCommit()));


        layout4->addWidget(label_4,0,0);
        layout4->addWidget(lineEdit4,0,1);
        layout4->addWidget(pushButton_open4,0,3);
        layout4->addWidget(pushButton_choose4,0,5);
        layout4->addWidget(pushButton_trans4,0,7);


        box4->setLayout(layout4);
        mainLayout1->addWidget(box4,3,0);

        ui2Trans->setLayout(mainLayout1);
    }

    if(m_showTab5)
    {
        file = new QListWidget();
        m_tabUI->addTab(file,QS("文件浏览"));

        dir = new QDir();
        qDebug()<<dir->path()<<endl;
        showFiledir();
        file->installEventFilter(this);
        connect(file,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(slotDirShow(QListWidgetItem*)));
        menu = new QMenu(this);
        QAction *rename = menu->addAction(QS("重命名此文件"));
        connect(rename,SIGNAL(triggered(bool)), this, SLOT(renameFile()));
        QAction *deletefile= menu->addAction(QS("删除文件"));
        connect(deletefile,SIGNAL(triggered(bool)), this,SLOT(deleteFile()));
        QAction* open = menu->addAction(QS("打开文件"));
        connect(open,SIGNAL(triggered(bool)), this, SLOT(openFile()));
        watcher = new QFileSystemWatcher(this);
        watcher->addPath(dir->path());
        connect(watcher,SIGNAL(directoryChanged(QString)),this,SLOT(showFiledir()));
        QAction* copy = menu->addAction(QS("复制文件"));
        connect(copy,SIGNAL(triggered(bool)), this, SLOT(copyFile()));

    }

}

Widget::~Widget()
{
}


void Widget::chooseDir()
{
//   QString path = QFileDialog::getExistingDirectory(this,"choose exe directory.","D:/");
    QString path = QFileDialog::getOpenFileName(this,QString::fromLocal8Bit("打开exe文件"),"D:/","exe files(*.exe)");

   qDebug()<<path<<endl;
}

void Widget::chooseDirFromCurrentDir()
{
//    QString path = QFileDialog::getExistingDirectory(this,"choose cpp directory.","./");//打开文件夹用这个

    //打开文件用下面这个
    QString path = QFileDialog::getOpenFileName(this,QString::fromLocal8Bit("打开cpp文件"),"/","cpp files(*.cpp)");
    qDebug()<<path<<endl;
}

void Widget::finishCommit()
{
    QMessageBox::information(NULL,QS("提示"),QS("这是一个信息框!"),QMessageBox::Ok);
}

void Widget::slotDirShow(QListWidgetItem * item)
{
    qDebug()<<item->whatsThis()<<endl;
    if(item->whatsThis()=="file")
    {
        openFile();
        return;
    }
    else if(item->whatsThis()!="dir")
    {
        return;
    }
//    return;
    qDebug()<<"dir = "<<item->text()<<endl;
    watcher->removePath(dir->path());//去掉之前路径的监视
    dir->cd(item->text());
    qDebug()<<dir->path()<<endl;
    watcher->addPath(dir->path());//添加新路径的监视
    showFiledir();//切换以后,重新展示即可
}

void Widget::renameFile()
{
    bool ok = false;
    QInputDialog* dialog = new QInputDialog();
    dialog->setFixedSize(350,250);
    dialog->setWindowTitle(QS("提示"));
//    dialog->setGeometry(100,100,100,100);
    dialog->setLabelText(QS("请输入新的文件名:"));
    dialog->setOkButtonText(QS("确认"));
    dialog->setCancelButtonText(QS("取消"));

    //前面设置的属性,一用getText就没用了。

    QString filename = dialog->getText(NULL, QS("提示"),QS("请输入新的文件名:"), QLineEdit::Normal,0, &ok);

    if(filename.isEmpty())
    {
        return;
    }
    if(file->currentItem()->whatsThis()=="dir")
    {
        QString path = dir->path() + "/" + file->currentItem()->text();
        qDebug()<<QS("重命名文件: ")<<path<<endl;
        QString newpath = dir->path() + "/" + filename;
        dir->rename(path,newpath);
    }
    else if(file->currentItem()->whatsThis()=="file")
    {
        QString path = dir->path() + "/" + file->currentItem()->text();
        qDebug()<<QS("重命名文件: ")<<path<<endl;
        QString newpath = dir->path() + "/" + filename;
        dir->rename(path,newpath);
    }

}

void Widget::deleteFile()
{
    QString path = dir->path() + "/" + file->currentItem()->text();
    qDebug()<<QS("删除文件: ")<<path<<endl;
    if(file->currentItem()->whatsThis()=="dir")
    {
        dir->rmpath(path);
    }
    else if(file->currentItem()->whatsThis()=="file")
    {
        dir->remove(path);
    }

}

void Widget::copyFile()
{
    bool ok = false;
    QInputDialog* dialog = new QInputDialog();
    dialog->setFixedSize(350,250);
    dialog->setWindowTitle(QS("提示"));
//    dialog->setGeometry(100,100,100,100);
    dialog->setLabelText(QS("请输入新的文件名:"));
    dialog->setOkButtonText(QS("确认"));
    dialog->setCancelButtonText(QS("取消"));
//    qDebug()<<dialog->textValue()<<endl;

    QString filename = dialog->getText(NULL, QS("提示"),QS("请输入新的文件名:"), QLineEdit::Normal,0, &ok);

    if(filename.isEmpty())
    {
        return;
    }
    if(file->currentItem()->whatsThis()=="dir")
    {
        //文件夹复制需要多个文件,暂不处理
    }
    else if(file->currentItem()->whatsThis()=="file")
    {
        QString path = dir->path() + "/" + file->currentItem()->text();
        qDebug()<<QS("复制文件: ")<<path<<endl;
        QString newpath = dir->path() + "/" + filename;
        QFile::copy(path,newpath);
    }

}

void Widget::openFile()
{
    qDebug()<<QS("打开文件")<<endl;
    QString path = dir->path() + QS("/") + file->currentItem()->text();
    qDebug()<<path<<endl;
//    QDesktopServices::openUrl(path);
//    path = path.toLocal8Bit().constData();
//    path = QString::fromStdWString(data);
    QDesktopServices::openUrl(qsTQS(path)); //中文文件打不开,就用这个宏定义就好了。

}

/*
 * 重新展示文件夹
 */
void Widget::showFiledir()
{
    file->clear();
    QFileInfoList list = dir->entryInfoList(QDir::AllEntries|QDir::NoDot);
    for(int i=0;i<list.count();i++)
    {
        QFileInfo tmpInfo = list.at(i);
        if(tmpInfo.isDir())
        {
            QIcon icon("dir.png");
            QString fileName = tmpInfo.fileName();
            QListWidgetItem *tmp = new QListWidgetItem(icon,fileName);
            tmp->setWhatsThis("dir");
            file->addItem(tmp);
        }
    }
    for(int i=0;i<list.count();i++)
    {
        QFileInfo tmpInfo = list.at(i);
        if(tmpInfo.isFile())
        {
            QIcon icon("file.png");
            QString fileName = tmpInfo.fileName();
            QListWidgetItem *tmp = new QListWidgetItem(icon,fileName);
            tmp->setWhatsThis("file");
            file->addItem(tmp);
        }
    }
}


bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    // 右键弹出菜单
    if (watched == (QObject*)file) {
        if (event->type() == QEvent::ContextMenu) {
            if(file->currentItem()!=NULL)//空白处不弹
            {
                menu->exec(QCursor::pos());
            }
        }
    }
    return QObject::eventFilter(watched, event);
}

posted @ 2022-03-19 07:53  念秋  阅读(3509)  评论(0编辑  收藏  举报