您的位置:首页 > 编程语言 > Qt开发

Qt学习笔记

2013-11-21 10:30 441 查看
2012.03.05 (4个)

问题1:样式表的继承作用域,因为子窗体自动继承父窗体的样式表,所以当需要限制父窗体的样式表作用域时,

解决方式:在change stylesheet中添加如下代码:

#login {

background-image: url(:/file/image/back.png);

}

#login * {

backpround-image:url();

}

注:login是父窗体的窗体,可以根据实际进行修改

问题二:更新ui文件

解决方式:

当修改了原工程文件中的UI文件后,但是运行后没有显示,可以使用uic命令更新UI文件,具体命令操作如下:

uic *.ui -o ui_*.h

uic命令在Qt Creator安装目录的qt/bin目录下。

其中*指代具体的文件名

如果此时还不行的话,再尝试关闭Qt Creator然后在打开。

注:在设置基类的时候尽量选择Widget

问题三:隐藏标题栏

解决方式:

去掉界面最上面的带有最大化、最小化、关闭标志的标题栏方法。在*.cpp的构造函数中添加:

setWindowFlags(Qt::FramelessWindowHint);

然后重新编译即可。

问题四:找不到QtNetwork文件(或QSql*文件、xml文件等模块文件)

解决方式:

本来存在的文件如QtNetwork等需要增加的模块但是找不到的话,只需要在工程文件中添加 QT += network(可以换成其他模块的文件)

2012-03-09(2个)

问题一:LineEdit中追加显示输入数据

解决方式:

方式一:声明一个QString s对象,然后让s指代LineEdit中的文本,档输入的时候使用+=运算符。假如输入1,表现形式为:s += '1';

然后让LineEdit中显示s即可.

方式二:使用如下代码QString s;

lineEdit->setText(s.append(添加内容));

问题二:在Label中动态显示时钟

解决方式:

增添一个定时器类,设置定时时间为1秒。档定时时间到时后,设置定时时间为1000毫秒(即1秒),然后使timeout信号连接槽函数,在槽函数中设置显示系统当前时间。

2012-03-12(2个)

问题一:LineEdit中不显示输入的最后一个字符,即回显

解决方式:使用如下代码

s = LineEdit->text();

ui->LineEdit->setText(s.(left(s.size() - 1)));

问题二:无法正常显示中文

解决方式:

尝试在main函数中添加如下代码:

QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf_8"));

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8"));

QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));

其中,codecForName中可供选项有:utf-8、gb2312、gb18030、gtk;以前两种为主。(仅限于正常显示中文,不限其他语言)

注:要添加头文件#include <QTextCodec>

使用该种方式可以使程序支持中文,不会出现中文乱码问题

2012-03-13

问题一:输出QString的内容

解决方式:使用qDebug() << QString即可在Application OUT窗口输出QString的内容

问题二:当某个界面操作时间超过一定时间后,自动返回主机面

解决方式:

在构造函数中启动一个定时器,连接timeout()信号,在槽函数中设置发送返回主界面的信号,在manager中进行连接即可。

2012-03-14

问题一:界面参数传递

解决方式:

方式一:在需要发送数据的界面中定义一个信号,该信号含有QString参数,然后在接收界面中定义的槽中也添加参数,使用connect连接这个信号和槽,这样参数就可以从发送方传递到接收方了。

方式二:在头文件中定义一个被调用类的对象,然后在需要调用的位置使用类名.成员名(成员名必须存在)

问题二:编译时产生警告:“control reaches end of non-void function”

解决方式:

是Main函数中没的返回值导致的,在所指示的函数最后加一句return 0或(return (int)value)即可。

2012-03-16

问题一:将从数据库中找到的符合条件的记录放入TableView中。并且设置为可读信息

解决方式:

使用QSqlTableModel中的成员函数setFileter(const string fileter),将查询条件即sql语句中where后面的部分当作const string filter即可.

设置可读使用成员函数setEditTriggers(QAbstractItemView::NoEditTriggers);

以上两个成员函数都要在select()之前使用。

问题二:在Qt中实现播放视频

解决方式:

使用Qt中的phonon库,实现播放视频。最简单的步骤如下:

安装phonon-backend-gstreamer和phonon-devel,然后在工程文件.pro中添加 “QT += phonon”。再需要实现播放功能的函数中添加:

Phonon::VideoPlayer *player = new Phonon::VideoPlayer(Phonon::VideoCategory, widget);//widget可以替换为其他需要显示视频的部件

player->load(Phonon::MediaSource("/root/test1.flv"));

player->play();

如果出现如下警告信息:WARNING: Phonon needs QCoreApplication::applicationName to be set to export audio output names through the DBUS interface

则说明没有给application命名,只要在QApplication a(argc,argv)下加入a.setApplicationName("Name");即可。(仅限于在main函数中显示视频时使用。)

注:因为在安装QT的时候默认设置是不安装phonon,所以在开始编译的时候会提示找不到phonon库,(或提示没有phonon这个头文件)。此时只需要重新装上phonon库即可。方法如下:

在终端中输入:apt-get install libphonon-dev,或是在新力得软件中心安装gstreamer等动态库即可。

2012-03-19

问题一:在一个界面中调用另一个界面中的内容//出现段错误,尚未解决

解决方式:

基于C++的原理,在调用界面中声明一个包含被调用部件的类,然后使用类名.调用部件或者是类名->调用部件(指针和非指针的区别)即可实现调用

问题二:在ubuntu中打开rar文件

解决方式:

安装ark库(即Ark压缩归档工具),安装完成后,在打开文件的时候使用Ark文件打开即可。

2012-03-21

问题一:出现如下错误信息:

QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use,

all queries will cease to work.

解决方式:

方法一:(按照手册提示)

在增加数据库驱动的下面一行添加:QSqlDatabase::database("sales");

在最后增加: QSqlDatabase::removeDatabase("sales");

方式二:

在main函数中实现打开数据库的操作,然后在其他界面中直接调用即可

问题二:不使用信号和槽的方式,解决界面之间的信息传递(A界面中的内容向B界面传递)

解决方式:

在A界面中声明一个QString的变量,让这个变量指向需要传递的内容,然后在B界面的头文件中声明一个A界面的类(需要包含A界面的.h文件),如A a;然后就可以在B界面中通过

a.string来调用界面A的信息

2012-03-26

问题一:socket通信中发送和接收数据

解决方式:

发送时使用如下代码:

QTcpSocket *socket = new QTcpSocket(this);

QByteArray block;

//组织需要发送的字符串

socket->write(block);//写入数据

接收时使用如下代码:

QByteArray block;

block = socket->read(字节数);//读取数据

QString string = QString(block);//转换为QString格式

问题二:在QByteArray中显示中文

解决方式:使用如下代码:

QTextCodec *tc = QTextCodec::codecForName("GBK");

QString string1 = tc->toUnicode(block);

如此后在string1中就可以显示了。

2012-03-27

问题一:在sql语句中使用变量

解决方式:

通过使用变量绑定的方式解决。如下代码所示:

query.prepare("insert into stu(id, name) values(:id, :name)");

query.bindValue(":id", 7, QSql::In);

query.bindValue(":name", s2, QSql::In);

2012-03-28

问题一: 关于Qt::CaseSensitivity和Qt::CaseInsensitivity

解决方式:

二者表示是否区分大小写。前者区分大小写,后者不去分大小写。使用方式是在其后面加上“ cs”,即Qt::CaseSensitivity cs或Qt::CaseInsensitivity cs

问题二:在tableView中显示数据库中的数据

解决方式:

使用如下代码

QSqlTableModel *model = new QSqlTableModel;

model->setTable("tablename");

model->select();

tableView->setModel(model);

如果不需要某些项目的话,使用model->removeColumn(需要删除的列的编号);(列的编号是以model->select()后出现的项目顺序进行排序,从0开始);

2012-03-29

问题一:int类型数据和QString类型的转换(将QString类型变量转换为int类型变量,进行完数学运算后,在将int类型变量转换为QString类型)

解决方式:

使用QString中的number成员函数,函数原型为:QString QString::number ( int n, int base = 10 )。具体实例如下:

QString::number(Degree_Purchase_Total.toInt(0, 10) + 100, 10)

2012-04-05

问题一:在qt中调用动态库(.so文件)

解决方式:使用QLibrary库,示例代码如下:

QLibrary lib(动态库名);//选择加载的动态库

typedef int (*fun)(参数列表);//声明函数指针,该参数列表主要依照被调用的函数确定

fun a = (fun)lib.resolve("调用的动态库的函数名");//不需要参数

if (a)

{

a(参数列表);//函数执行

}

注:动态库名只能存在于/usr/lib等系统路径下,所以要将使用的动态库放入/usr/lib或/lib中。或设置LD_LIBRARY_PATH变量

2012-04-09

问题一:处理大量的按钮输入时,如数字键盘等。

解决方式:

使用QButtionGroup,实例代码如下:

QButtonGroup *buGroup = new QButtonGroup(this);//按钮组

buGroup->addButton(ui->One_2,1);//添加按钮到QButtonGroup

buGroup->addButton(ui->Two_2, 2);

buGroup->addButton(ui->Three_2, 3);

Object::connect(buGroup, SIGNAL(buttonClicked(int)),this, SLOT(buttonNumslot(int)));

槽函数buttonNumslot(int num)的实现、:

ui->lineEdit->insert(QString::number(num));

问题二:按钮实现在两个lineEdit中输入数据

解决方式:

设置setFocus,首先取消按钮的Focus,即:

button->setFocusPolicy(Qt::NoFocus);//设置【清空】按钮无焦点

然后在上个的buttonNumslots中添加如下代码:

if(ui->worknum->hasFocus())//输入框1焦点

{

ui->worknum->insert(QString::number(num));

}

else if(ui->passwd->hasFocus())//输入框2焦点

{

ui->passwd->insert(QString::number(num));

}

注:对于星号和米字符需要额外实现,大体思路相同

2012-04-10

问题一:unsigned char *转换为QString (灵活使用强制类型转换)

解决方式:

现将unsigned char *转换为char *,然后在强制转换为QString,参考代码如下:

unsigned char a[] = "123";

QString string((char *)a);

2012-04-12

问题一:TableWidget显示的项目平均分配列所占用的长度

解决方式:使用如下代码:

QTableWidget *table = new QTableWidget();

table->setColumnCount(3);

table->setRowCount(5);

table->horizontalHeader()->setStretchLastSection(true); //就是这个地方

table->horizontalHeader()->setResizeMode(QHeaderView::Stretch);

table->show();

此种方式只能平均分配当前table的大小,但是不能随着table中数据的大小而改变,如果需要的话,应该使用:

tableView->resizeColumnsToContents();//按照内容设置列的宽度

问题二:改变tableWidget中分页的名称

解决方式:

使用tabWidget中的setTabText成员函数,函数原型为:void QTabWidget::setTabText ( int index, const QString & label )

参考代码如下:tabWidget->setTabText(0, "button");

问题三:在Qt中使用全局变量,即在各个界面中都能使用

解决方式:使用extern变量类型修饰符

在一个.h的头文件中声明需要全局使用的变量,在变量前面要加上extern修饰符此谓之声明,然后在.cpp文件中给这些变量赋值。此谓之定义。在其他文件中只需要在所有函数外边使用:变量类型 变量名 ,然后就可使用,在第二次使用时要在前面加上extern。不然编译器会报错:重复定义某个变量

此问题主要是extern的使用方法:先在一个文件中声明(即extern 变量类型 变量名,但不分配内存),然后再定义方可使用(定义方式:变量类型 变量名)。

注:(1)、尽量不要去修改全局变量的值,只是去使用。即将全局变量当作只读变量。防止出现不必要的麻烦。

(2)、调用全局变量的源文件可以不用包含全局变量所在的头文件,但最好是加上,因为几个文件间的相互包含makefile都给解决了。

(3)、这种方法有弊端,主要是如果在系统库函数中有和定义的全局变量同名的变量,将会造成冲突。并且其结构不符合面向对象的思想,

2012-04-13

问题一:在QString中使用arg()成员函数

解决方式:

QString s = QString("%1 %2...").arg("").arg("")....;arg中的内容自动和%1、%2按照顺序对应。在一个QString中,arg函数最多可以出现9次,因为arg函数原型如下:

QString QString::arg ( const QString & a1, const QString & a2, const QString & a3, const QString & a4,

const QString & a5, const QString & a6, const QString & a7, const QString & a8, const QString & a9 ) const

2012-04-17

问题一:在编译时出现此种错误:incomplete type 'QTextCodec' used in nested name specifier

解决方式:没有包含QTextCodec头文件。加上即可。

2012-04-20

问题一:取出tableView中特定行的值

解决方式:

首先创建槽关联信号clicked ( const QModelIndex & )的槽,在槽函数中使用如下代码:

int row = index.row();(index是QModelIndex *index,在槽函数声明的时候中自动添加的)

qDebug() << QString::number(row, 10); //测试选中第几行

QSqlRecord record = model->record(row); //声明一个QSqlRecord对象,存储查询结果

QString title = record.value("Data").toString(); //将选取的值存储在变量中

qDebug() << title;

2012-04-24

问题一:关于事件重构

解决方式:

首先在头文件中重新定义需要重构的事件,但一定要定义为protect类型,(保持原有类型不变),如

protect :

void showEvent(QShowEvent *e);

bool event(Qevent *e);

然后在源文件中重新实现该事件即可。

2012-04-25

问题一:获取本机网络信息

解决方式:QNetworkInterface类提供了程序所运行时的主机的IP地址和网络接口信息的列表。在每一个网络接口信息中都包含了0个或多个IP地址,而每一个IP地址又包含了和它相关的子网掩码和广播地址,它们三者被封装在一个QNetworkAddressEntry对象中。网络接口信息中也提供了硬件地址信息。而QHostInfo类的作用:通过主机名来查找IP地址,或者通过IP地址来反向查找主机名。

参考如下代码:

QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();//获取所有网络接口的列表

foreach(QNetworkInterface interface,list)//遍历每一个网络接口

{

if(interface.name()=="eth0")//我的端口是eth0,你的需要根据实际使用端口来进行判断来判断

{

qDebug() << "Device: "<<interface.name();//设备名

QString MAC = interface.hardwareAddress();//硬件地址

QList<QNetworkAddressEntry> entryList = interface.addressEntries();//获取IP地址条目列表,每个条目中包含一个IP地址,一个子网掩码和一个广播地址

foreach(QNetworkAddressEntry entry,entryList)//遍历每一个IP地址条目

{

if( entry.ip().toString().size() < 16)//区分IPV6和IPV4

{

qDebug()<<"IP Address: "<<entry.ip().toString();//IP地址

qDebug()<<"Netmask: " <<entry.netmask().toString();//子网掩码

qDebug()<<"Broadcast: "<<entry.broadcast().toString();//广播地址

}

}

}

}

2012-04-26

问题一:QString类中的一些函数介绍,replace()、remove()

解决方式:

replace()函数的作用是使用一个字符串来代替另一个字符串中的某一部分。如:

QString str = "a cloudy day";

str.replace(2, 6, "sunny"); //结果为a sunny day

重载的replace()函数让第二个参数代替所有出现第一个参数的地方。如:

str.replace("a", "aaaaaaaa");//用“aaaaaaaa”替换所有出现“a”的地方。

remove()函数的作用是删除一个字符串中的某些部分。如:

QString str = "a cloudy day";

str.remove(2, 6); //结果为a day

从const char *转换为QString的方式为:QString str += "(const char *)";或是使用加上QString的强制转换,或者调用fromAscii()或fromLatin1()。

问题二:QFile经常使用的成员函数,

解决方式:

构造函数QFile(文件名),open(打开方式,常用有QIODevice::ReadWrite | QIODevice::Text),判断是否到文件末尾atEnd(), 读取一行数据readline()

2012-05-02

问题一:qPrintable使用方法

解决方式:官方网站的帮助手册上的内容如下:

函数原型:const char * qPrintable ( const QString & str )

内容详解:Returns str as a const char *. This is equivalent to str.toLocal8Bit().constData().//返回const char * 类型的str。等同于使用

str.tiLocal8Bit().constData().

The char pointer will be invalid after the statement in which qPrintable() is used. This is because the array returned by toLocal8Bit() will fall out of scope.

//字符指针将在使用了qPrintable()后失效,这是因为通过toLocal8Bit()返回的数组会超出范围。

实例:

qWarning("%s: %s", qPrintable(key), qPrintable(value));

有关系的函数:qDebug(), qWarning(), qCritical(), and qFatal().

问题二:在qt中执行shell程序或是其他外部程序

解决方式:使用Linux C函数system或QProcesse::execute(),或使用QProcess中的成员函数,一定要把路径写对。不然的话无法执行

参考代码如下:

//system("/bin/ls /");//使用system函数,

//QProcess::execute("/bin/ls /");//使用QProcess::execute()

QProcess *pro = new QProcess;//使用QProcess中的成员函数start

pro->start("/bin/ls / > hh.txt");

2012-05-03

问题一:使用XML的基本知识,XML文件的增删改查功能

解决方式:

在操作XML文件时,经常使用的类还有:QDomNode, QDomDocument, QDomElement和QDomText。官方手册示例代码如下:

QFile file("mydocument.xml");

if (!file.open(QIODevice::ReadOnly))

return;

if (!doc.setContent(&file)) {

file.close();

return;

}

file.close();

// print out the element names of all elements that are direct children

// of the outermost element.

QDomElement docElem = doc.documentElement();

QDomNode n = docElem.firstChild();

while(!n.isNull()) {

QDomElement e = n.toElement(); // try to convert the node to an element.

if(!e.isNull()) {

cout << qPrintable(e.tagName()) << endl; // the node really is an element.

}

n = n.nextSibling();

}

1、增加节点功能:创建文档数据的函数包括createElement()、createTextNode() createComment() createCDATASection() createProcessingInstruction() createAttribute()和createEntityReference().

2、从XML节点中读取信息

首先以只读方式打开xml文件,然后声明QDomDocument类的一个对象(如doc),使用成员函数setContent()将xml文件导入doc中。导入成功后,即可关闭文件。声明QDomNodeList类list,使其等于doc.elementsByTagName(tagname); 此为寻找根节点,然后使用for循环,遍历该节点(for
(int i = 0; i < list.count(); i++))。在for循环中声明QDomElement类的对象Node,使Node等于list中的各个字节点。再次声明类QDomNodeList类的对象NodeList,使NodeList等于Node的子节点。然后就可以使用at(index)将NodeList的index节点赋值给其他变量。具体情况看其到底有多少个父子节点确定使用多少次该循环(除去寻找根节点以外)。

2012-05-04

问题一:改变LineEdit中字体的大小

解决方式:

(方式1)、整体界面字体设置方法:在main函数中添加如下代码:

QFont font = app .font();

font.setPointSize(16);

app.setFont(font);

(方式2)、在Qt/embedded中显示中文,可以采用如下运行方式:./wireless -qws -font unifont

(方式3)、改变Qt中QLineEdit中显示内容的大小:

QLineEdit *lineEdit = new QLineEdit();

lineEdit->setStyleSheet("font-size : 16px");

也可以在主函数中添加语句:

qApp->setStyleSheet("QLineEdit { font: 16px; });

2012-05-05

问题一:模拟在文件操作中打开按钮然后显示路径

解决方式:

主要使用QFileDialog中的getOpenFileName()函数,函数原型是:

QString QFileDialog::getOpenFileName ( QWidget * parent = 0, const QString & caption = QString(),

const QString & dir = QString(), const QString & filter = QString(),

QString * selectedFilter = 0, Options options = 0 )

。然后使用类QDir中的toNativeSepearators()函数获取路径。该函数原型是:

QString QDir::toNativeSeparators ( const QString & pathName ) ;

实例代码如下:

QString FilePath = ui->lineEdit->text();

if (FilePath.isEmpty())

FilePath = QDir::homePath();

QString file = QFileDialog::getOpenFileName(0, tr("choose file"), FilePath);

file = QDir::toNativeSeparators(file);

if (!file.isEmpty())

ui->lineEdit->setText(file);

2012-05-07

问题一:彻底解决连接SqLite的移除默认连接的问题

解决方式:

在主函数中打开数据库,然后在其他的类中对数据库的表进行操作,然后在析构函数中对断开链接,关闭数据库

2012-05-09

问题一:数据库的错误类型

解决方式:数据库的错误类型主要包含在QSqlError类。使用此类的各个模式中的lastError()成员函数就可以获得错误类型。常见的错误类型使用QSqlErrorErrorType枚举类型:

具体内容如下所示:

Constant Value Description

QSqlError::NoError 0 No error occurred.(正常,没有错误发生)

QSqlError::ConnectionError 1 Connection error.(连接错误)

QSqlError::StatementError 2 SQL statement syntax error.(sql语句语法错误)

QSqlError::TransactionError 3 Transaction failed error.(转换错误)

QSqlError::UnknownError 4 Unknown error.(未知错误)

问题二:QGroupBox设置边框

解决方式:用样式表来设置边框

选择 change stylesheet,输入

QGroupBox {

border-width:1px; //线的粗细

border-style:solid;

border-color:lightGray; //颜色,

margin-top: 0.5ex; //文字在方框中位置的偏离度

}

QGroupBox::title {

subcontrol-origin: margin;

subcontrol-position: top left;

left:25px; //线的偏离度

margin-left: 0px;

padding:0 1px; //文字在方框中位置的偏离度

}

在程序中测试时未通过,(第一次测试时)

2012-05-16

问题一:设置TableView的高亮显示

解决方式:

添加如下代码:

ui->Single_View->setSelectionBehavior(QAbstractItemView::SelectRows);

2012-05-23

问题一:清空QTableView中的内容

解决方式:

重新定义一个model(TableModel、QSqlQueryModel等任何模型均可),然后使用TableView中的setModel成员函数重新加载即可

问题二:设置SQLite表中的某一个字段为自增字段

解决方式:

从 SQLite 的 2.3.4 版本开始,如果你将一个表中的一个字段声明为 INTEGER PRIMARY KEY,

那么无论你何时向该表的该字段插入一个 NULL 值,这个 NULL 值将自动被更换为比表中该字段所有行的最大值大 1 的整数;如果表为空,那么将被更换为 1。

注:在插入的时候不用插入该字段。

2012-05-28

问题一:在使用线程结束时出现如下错误:QThread: Destroyed while thread is still running

解决方式:在调用线程的类的析构函数中添加thread->exit();意思是退出线程,不要使用wait(),因为当使用wait函数后,程序一直在等待主线程的退出

2012-05-29

问题一:在使用图形界面方式裁剪配置内核文件时(即使用make menuconfig命令),出现如下错误:Unable to find the ncurses libraries or the required header files.

*** 'make menuconfig' requires the ncurses libraries.

解决方式:安装ncurses库,支持图形界面的内核配置方式。apt-get install libncurses5-dev 或者下载安装包,解压后使用make install命令安装

2012-06-04

问题一:mplayer重复播放

解决方式:

mplayer -loop 0,(无限循环,0是循环次数!)

命令行添加,如果是GUI,添加至播放参数!

2012-06-11

问题一:出现错误信息:name lookup of ‘i’ changed for ISO ‘for’ scoping

解决方式:

此种错误的出现是由于在程序中使用局部变量i所置。即在i的作用域之外使用了变量i,只要扩大i的作用域即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: