【6】QT文件拖放并读取

2017-01-22  本文已影响129人  业余玩家

今天终于能够安静的学点东西了,最近这些天总是能够碰到一些小事要处理,都快没有学习的欲望了,大概是快要过年的缘故吧。最近发现一个好玩的东西,calm网站能够聆听一些自然的声音,比如雨声,流水声等,今天就是听着这个声音来敲着代码,感觉有点意思。

文件拖放并读取里面的内容
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDrag>
#include <QTextEdit>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
#include <QList>
#include <QDebug>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    void dragEnterEvent(QDragEnterEvent *event);
    void dropEvent(QDropEvent *event);
private:
    bool readFile(const QString &fileName);
    QTextEdit *textEdit;

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    textEdit = new QTextEdit;
    setCentralWidget(textEdit);

    //设定为只读
    textEdit->setReadOnly(true);

    //支持拖放
    setAcceptDrops(true);

    setWindowTitle(tr("text editor"));
}

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

//当用户拖动文件到窗口部件上时候,就会触发dragEnterEvent事件
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
    //如果为文件,则支持拖放
    if (event->mimeData()->hasFormat("text/uri-list"))
        event->acceptProposedAction();
}

//当用户放下这个文件后,就会触发dropEvent事件
void MainWindow::dropEvent(QDropEvent *event)
{

    QList<QUrl> urls = event->mimeData()->urls();
    if(urls.isEmpty())
        return;
    //多个文件取第一个来进行后面的操作
    QString fileName = urls.first().toLocalFile();
    if (fileName.isEmpty()) {
        return;
    }

    if (readFile(fileName)) {
        setWindowTitle(tr("%1 - %2").arg(fileName, tr("Drag File")));
    }
}
//读取文本内容
bool MainWindow::readFile(const QString &fileName)
{
    bool r = false;
    QFile file(fileName);
    QString content;
    if(file.open(QIODevice::ReadOnly)) {
        content = file.readAll();
        r = true;
    }
    textEdit->setText(content);
    return r;
}
//main.cpp
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

备注:这个代码虽然不多,但是花了很多时间,按照豆子博主的那种写法,其实没有得到想要的效果,刚开始也找不到问题的所在,于是在网上看了其他人写的一些代码,经过多次设置断点调试才发现问题所在,把textEdit要设置为只读模式才能读取到文本的内容。

计蒜客 计数和数数

“伯爵说”序列如下:1,11,21,1211,111221,…。其1读作one 1或者11。11读作two 1s或者21。21读作one 2, one 1或者1211。
题目的意思就是一个元素中存在几个1,几个2,几个3...然后将结果作为下一个元素,依次类推下去得到这个序列。

#include<iostream>    
using namespace std;    
string result[100];    
string str(string s) {         //具体的转换函数    
  string a = "";    
  int l = s.length(), i, j, m;    
  for (i = 0; i < l; i = i + m) {    
      m = 1;    
      for (j = i + 1; j < l; j++) {    
        if (s[i] == s[j])    
          m++;    
        else    
          break;    
      }    
      char c = m + '0';    
      a.push_back(c);    
      a.push_back(s[i]);    
  }    
  return a;    
}    
string rec(int n) {   //动态规划函数    
  string res;    
  if(result[n] != "")     
    return result[n];    
  if (n == 1)    
    res = "1";    
  else    
    res = str(rec(n - 1));    
  return res;    
}     
int main() {    
  int n;    
  while(cin >> n)    
    cout << rec(n) << endl;    
}

备注:这段代码来自网络,自己写了半天,发现总是有bug,于是就参考了其他人的解法,来了解一下这个题目。

上一篇下一篇

猜你喜欢

热点阅读