常見的幾個Qt編程問題的處理

http://hi.baidu.com/aoxuehan424/blog/item/500c40ce03549533b700c81c.html

常見的幾個Qt編程問題的處理


2、如何用打開和保存文件對話框
答:使用QFileDialog

 

QString fileName = QFileDialog::getOpenFileName(this);
if (!fileName.isEmpty())

{
   loadFile(fileName);
}


   QString fileName = QFileDialog::getSaveFileName(this);
   if (fileName.isEmpty())

   {
return false;
   }

選擇文件夾

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;



9、在Windows下Qt裏爲什麼沒有終端輸出?
答:把下面的配置項加入到.pro文件中


win32:CONFIG += console

11、想在源代碼中直接使用中文,而不使用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);


12、爲什麼將開發的使用數據庫的程序發佈到其它機器就連接不上數據庫?
答:這是由於程序找不到數據庫插件而致,可照如下解決方法:
在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部分


13、如何創建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程序的寫法,遵從各平臺級編譯器所定的規則。

14、如何啓動一個外部程序
答: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();

 


19、如何製作不規則形狀的窗體或部件
答:請參考下面的帖子
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")來刪除連接。

21、如何顯示一個圖片並使其隨窗體同步縮放
答:下面給出一個從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);
}


22、Windows下如何讀串口信息
答:可通過註冊表來讀
qt4.1.0 讀取註冊表得到 串口信息的方法!

 

 

 

 

自己遇到的:

1.背景修改

QString filename = "E:/圖片/壁紙/1.jpg";
QPixmap pixmap(filename);
pal.setBrush(QPalette::Window,QBrush(pixmap));
setPalette(pal);   

 

2.載入某個指定類型文件

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));
}

3.QText亂碼問題
發佈到別的機器上後,中文全是亂碼。gb18030和gb2312我都試過了,都是亂碼。
main.cpp裏設置如下:
QTextCodec *codec = QTextCodec::codecForName("System");
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
把gb2312改成System就可以了
#include <QTextCodec>


4.圖片問題
用label就可以載入圖片,方法:
label->setPixmap(QPixmap(“path(可以用geifilename函數得到)”));
但是這樣的label沒有滾動條,很不靈活,可以這樣處理:
在QtDesign中創建一個QScrollArea控件,設置一些屬性,然後在代碼中新建一個label指針,在cpp的構造函數中用new QLabel(this)初始化(一定要有this,不然後面setWidget會出錯)。然後再:
scrollArea->setWidget(label_2);
scrollArea->show();

5.佈局
最後要充滿窗口,點擊最外層的窗口空白處。再點擊水平layout即可

6.程序圖標  
準備一個ICO圖標,把這個圖標複製到程序的主目錄下,姑且名字叫”myicon.ico”吧。然後編寫一個icon.rc文件。裏面只有一行文字:
IDI_ICON1               ICON                    “myicon.ico”
最後,在工程的pro文件里加入一行:
RC_FILE = icon.rc
qmake和make一下,就可以發現你的應用程序擁有漂亮的圖標了。

7.回車輸出
QT中操作文件,從文件流QTextStream輸出回車到txt的方法是<< 'r' << endl;

8.QListView的添加或者刪除

QStringList user;
user += "first";
user +="second";
QStringListModel *model = new QStringListModel(user);
userList->setModel(model);        //useList是個QListView
user += "third";
model->setStringList(user);

9.設置背景音樂

如果只是簡單的設置背景音樂的話。用QSound。具體查看qt助手。

windows下的QSound 只能播放wav格式哦。。

10.禁止QAbstractItemView的子類的雙擊修改功能。

比如listview,雙擊某個item就會成爲編輯模式。禁止此功能。用:

QAbstractItemVIew`s name->setEditTriggers(QAbstractItemView::NoEditTriggers);

11.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)

 

12.qt確認對話框

QMessageBox   mb(tr("刪除確認"), tr("確認刪除此項?"),
   QMessageBox::Question,
   QMessageBox::Yes   |   QMessageBox::Default,
   QMessageBox::No     |   QMessageBox::Escape,
   QMessageBox::NoButton);  
if(mb.exec() == QMessageBox::No)  
   return;

13.QListView
QStringList user;
user += "first";
user +="second";
QStringListModel *model = new QStringListModel(user);
QListView user_id->setModel(model);

user += "third"; 下面2步是更新
model->setStringList(user);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章