QT 一些非常常用的操作


一   如果在窗體關閉前自行判斷是否可關閉
二   如何用打開和保存文件對話框  
三   如何使用警告、信息等對話框  
四   在Windows下Qt里為什么沒有終端輸出
五   想在源代碼中直接使用中文,而不使用tr()函數進行轉換,怎么辦
六   為什么將開發的使用數據庫的程序發布到其它機器就連接不上數據庫
七   如何創建QT使用的DLL(.so)以及如何使用此DLL(.so)
八   如何啟動一個外部程序
九   如何制作不規則形狀的窗體或部件
十   如何顯示一個圖片並使其隨窗體同步縮放
十一  Windows下如何讀串口信息
十二 背景修改
十三  載入某個指定類型文件
十四  用label就可以載入圖片
十五  載入某個指定類型文件布局
十六   程序圖標
十七   回車輸出
十九   設置背景音樂
二十   禁止QAbstractItemView的子類的雙擊修改功能。
二十一   qt對文件的操作
二十二   qt自定義確認對話框

一  如果在窗體關閉前自行判斷是否可關閉
  答:重新實現這個窗體的closeEvent()函數,加入判斷操作
  void MainWindow::closeEvent(QCloseEvent *event)
  {
  if (maybeSave())
  {
  writeSettings();
  event->accept();
  }
  else
  {
  event->ignore();
  }
  }
二  如何用打開和保存文件對話框
  答:使用QFileDialog
  QString fileName = QFileDialog::getOpenFileName(this);
  if (!fileName.isEmpty())
  {
  loadFile(fileName);
  }
  QString fileName = QFileDialog::getSaveFileName(this);
  if (fileName.isEmpty())
  {
  return false;
  }
  如果用qt自帶的話:
  選擇文件夾
  QFileDialog* openFilePath = new QFileDialog( this, " 請選擇文件夾", "file");     //打開一個目錄選擇對

話框
  openFilePath-> setFileMode( QFileDialog::DirectoryOnly );
  if ( openFilePath->exec() == QDialog::Accepted )
  {
  //code here!
  }
  delete openFilePath;
  選擇文件:
  QFileDialog *openFilePath = new QFileDialog(this);
  openFilePath->setWindowTitle(tr("請選擇文件"));
  openFilePath->setDirectory(".");
  openFilePath->setFilter(tr("txt or image(*.jpg *.png *.bmp *.tiff *.jpeg *.txt)"));
  if(openFilePath->exec() == QDialog::Accepted)
  {
  //code here
  }
  delete openFilePath;
三 如何使用警告、信息等對話框
  答:使用QMessageBox類的靜態方法
  int ret = QMessageBox::warning(this, tr("Application"),
  tr("The document has been modified./n"
  "Do you want to save your changes?"),
  QMessageBox::Yes | QMessageBox::Default,
  QMessageBox::No,
  QMessageBox::Cancel | QMessageBox::Escape);
  if (ret == QMessageBox::Yes)
  return save();
  else if (ret == QMessageBox::Cancel)
  return false;
  或者簡單點兒:
  QMessageBox::information(this, "關於","盲人輔助系統(管理端)!/nVersion:1.0/nNo Copyright");
四  在Windows下Qt里為什么沒有終端輸出?
  答:把下面的配置項加入到.pro文件中
  win32:CONFIG += console
五 想在源代碼中直接使用中文,而不使用tr()函數進行轉換,怎么辦?
  答:在main函數中加入下面三條語句,但並不提倡
  QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
  QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
  QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
  或者
  QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
  QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
  QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
  使用GBK還是使用UTF-8,依源文件中漢字使用的內碼而定
  這樣,就可在源文件中直接使用中文,比如:
  QMessageBox::information(NULL, "信息", "關於本軟件的演示信息", QMessageBox::Ok,

QMessageBox::NoButtons);
六 為什么將開發的使用數據庫的程序發布到其它機器就連接不上數據庫?
  答:這是由於程序找不到數據庫插件而致,可照如下解決方法:
  在main函數中加入下面語句:
  QApplication::addLibraryPath(strPluginsPath");
  strPluginsPath是插件所在目錄,比如此目錄為/myapplication/plugins
  則將需要的sql驅動,比如qsqlmysql.dll, qsqlodbc.dll或對應的.so文件放到
  /myapplication/plugins/sqldrivers/
  目錄下面就行了
  這是一種解決方法,還有一種通用的解決方法,即在可執行文件目錄下寫qt.conf文件,把系統相關的一些目錄配置

寫到qt.conf文件里,詳細情況情參考Qt Document Reference里的qt.conf部分
七 如何創建QT使用的DLL(.so)以及如何使用此DLL(.so)
  答:創建DLL時其工程使用lib模板
  TEMPLATE=lib
  而源文件則和使用普通的源文件一樣,注意把頭文件和源文件分開,因為在其它程序使用此DLL時需要此頭文件
  在使用此DLL時,則在此工程源文件中引入DLL頭文件,並在.pro文件中加入下面配置項:
  LIBS += -Lyourdlllibpath -lyourdlllibname
  Windows下和Linux下同樣(Windows下生成的DLL文件名為yourdlllibname.dll而在Linux下生成的為

libyourdlllibname.so。注意,關於DLL程序的寫法,遵從各平台級編譯器所定的規則。
八 如何啟動一個外部程序
  答:1、使用QProcess::startDetached()方法,啟動外部程序后立即返回;
  2、使用QProcess::execute(),不過使用此方法時程序會最阻塞直到此方法執行的程序結束后返回,這時候可使用

QProcess和QThread這兩個類結合使用的方法來處理,
    以防止在主線程中調用而導致阻塞的情況
  先從QThread繼承一個類,重新實現run()函數:
  class MyThread : public QThread
  {
  public:
  void run();
  };
  void MyThread::run()
  {
  QProcess::execute("notepad.exe");
  }
  這樣,在使用的時候則可定義一個MyThread類型的成員變量,使用時調用其start()方法:
  class ...............
  {...........
  MyThread thread;
  ............
  };
  .....................
  thread.start();
九 如何制作不規則形狀的窗體或部件
  答:請參考下面的帖子
  http://www.qtcn.org/bbs/read.php?tid=8681
  20、刪除數據庫時出現"QSqlDatabasePrivate::removeDatabase: connection 'xxxx' is still in use, all

queries will cease to work"該如何處理
  答:出現此種錯誤是因為使用了連接名字為xxxx的變量作用域沒有結束,解決方法是在所有使用了xxxx連接
    的數據庫組件變量的作用域都結束后再使用QSqlDatabase::removeDatabae("xxxx")來刪除連接。
十  如何顯示一個圖片並使其隨窗體同步縮放
  答:下面給出一個從QWidget派生的類ImageWidget,來設置其背景為一個圖片,並可隨着窗體改變而改變,其實從下

面的代碼中
    可以引申出其它許多方法,如果需要的話,可以從這個類再派生出其它類來使用。
  頭文件: ImageWidget.hpp
  #ifndef IMAGEWIDGET_HPP
  #define IMAGEWIDGET_HPP
  #include <QtCore>
  #include <QtGui>
  class ImageWidget : public QWidget
  {
  Q_OBJECT
  public:
  ImageWidget(QWidget *parent = 0, Qt::WindowFlags f = 0);
  virtual ~ImageWidget();
  protected:
  void resizeEvent(QResizeEvent *event);
  private:
  QImage _image;
  };
  #endif
  CPP文件: ImageWidget.cpp
  #include "ImageWidget.hpp"
  ImageWidget::ImageWidget(QWidget *parent, Qt::WindowFlags f)
  : QWidget(parent, f)
  {
  _image.load("image/image_background");
  setAutoFillBackground(true);   // 這個屬性一定要設置
  QPalette pal(palette());
  pal.setBrush(QPalette::Window,
  QBrush(_image.scaled(size(), Qt::IgnoreAspectRatio,
  Qt::SmoothTransformation)));
  setPalette(pal);
  }
  ImageWidget::~ImageWidget()
  {
  }
  // 隨着窗體變化而設置背景
  void ImageWidget::resizeEvent(QResizeEvent *event)
  {
  QWidget::resizeEvent(event);
  QPalette pal(palette());
  pal.setBrush(QPalette::Window,
  QBrush(_image.scaled(event->size(), Qt::IgnoreAspectRatio,
  Qt::SmoothTransformation)));
  setPalette(pal);
  }
十一 Windows下如何讀串口信息
  答:可通過注冊表來讀qt4.1.0 讀取注冊表得到 串口信息的方法!
十二 背景修改
  QString filename = "E:/圖片/壁紙/1.jpg";
  QPixmap pixmap(filename);
  pal.setBrush(QPalette::Window,QBrush(pixmap));
  setPalette(pal);
十三  載入某個指定類型文件
  openFileName = QFileDialog::getOpenFileName(this,tr("Open Image"), "/home/picture", tr("Image Files

(*.png *.tif *.jpg *.bmp)"));
  if (!openFileName.isEmpty())
  {
  Ui_Project_UiClass::statusBar->showMessage("當前打開的文件:" + openFileName);
  label_2->setPixmap(QPixmap(openFileName));
  }
十四 圖片問題
  用label就可以載入圖片,方法:
  label->setPixmap(QPixmap(“path(可以用geifilename函數得到)”));
  但是這樣的label沒有滾動條,很不靈活,可以這樣處理:
  在QtDesign中創建一個QScrollArea控件,設置一些屬性,然后在代碼中新建一個label指針,在cpp的構造函數中用

new QLabel(this)初始化(一定要有this,不然后面setWidget會出錯)。然后再:
  scrollArea->setWidget(label_2);
  scrollArea->show();
十五  載入某個指定類型文件布局
  最后要充滿窗口,點擊最外層的窗口空白處。再點擊水平layout即可
十六 程序圖標
  准備一個ICO圖標,把這個圖標復制到程序的主目錄下,姑且名字叫”myicon.ico”吧。然后編寫一個icon.rc文件。

里面只有一行文字:
  IDI_ICON1               ICON                    “myicon.ico”
  最后,在工程的pro文件里加入一行:
  RC_FILE = icon.rc
  qmake和make一下,就可以發現你的應用程序擁有漂亮的圖標了。
十七  回車輸出
  QT中操作文件,從文件流QTextStream輸出回車到txt的方法是<< 'r' << endl;
十九  設置背景音樂
  如果只是簡單的設置背景音樂的話。用QSound。具體查看qt助手。
  windows下的QSound 只能播放wav格式哦。。
二十  禁止QAbstractItemView的子類的雙擊修改功能。
  比如listview,雙擊某個item就會成為編輯模式。禁止此功能。用:
  QAbstractItemVIew`s name->setEditTriggers(QAbstractItemView::NoEditTriggers);
二十一  qt對文件的操作
  讀文件
  QFile inputFile(":/forms/input.txt");
  inputFile.open(QIODevice::ReadOnly);
  QTextStream in(&inputFile);
  QString line = in.readAll();
  inputFile.close();
  寫文件
  QFile file(filename);
  if (!file.open(QIODevice::WriteOnly))
  {
  fprintf(stderr, "Could not open %s for writing: %s/n",
  qPrintable(filename),
  qPrintable(file.errorString()));
  return false;
  }
  file.write(data->readAll());
  file.close();
  將某個路徑轉化為當前系統認可的路徑
  QDir::convertSeparators(openFileName)
  獲取當前路徑
  QDir currentPath;
  QString filePath = currentPath.absolutePath ();
  QString path = QDir::convertSeparators(filePath + "/" +clickedClass);
  一些操作
  Qfile::exists(fileName)
  Qfile::Remove();
  文件打開模式
  if(file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::ReadOnly)
二十二  qt確認對話框
  QMessageBox   mb(tr("刪除確認"), tr("確認刪除此項?"),
  QMessageBox::Question,
  QMessageBox::Yes   |   QMessageBox::Default,
  QMessageBox::No     |   QMessageBox::Escape,
  QMessageBox::NoButton);
  if(mb.exec() == QMessageBox::No)
  return;

http://blog.csdn.net/zhangxiaonanwin/article/details/6088317


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM