在这里记录一些自己遇到的在QT开发上面的小问题和tips
目录
QComboBox 设置qss样式不生效
我设置的样式是:
box->setStyleSheet("QComboBox {"
"border: none;"
"padding: 5px;"
"background-color: rgb(6,68,98);"
"color: white;"
"font:14pt '黑体';"
" height: 40px;"
"}"
"QComboBox::drop-down{"
"width: 20px;"
"height: 10px;"
"subcontrol-origin: padding;"
"subcontrol-position: center right ;"
"margin-right: 10px;"
"border-image: url(your path);"
"background-color:transparent;"
"}"
"QComboBox QAbstractItemView { "
"height: 40px; font-family: '黑体'; font-size: 13pt;"
"background-color: rgb(6,68,98); color: white;"
"}"
);
解决方法:必须需要使用 box->setView(new QListView())才能生效,另外如果要设置下拉列表的格式就需要设置QComboBox QAbstractItemView 部分。
原因:不明
qt按钮设置点击释放效果
//使用lambda表达式将button的信号连接到表达式实现样式改变
connect(button,&QPushButton::pressed,[this](){
button->setStyleSheet("background-image:url(your path);font: 13pt '黑体';color:red; "
"border-left: 2px solid white;"
"border-top: 2px solid white;"
"border-right: none;"
"border-bottom: none;");
});
connect(button,&QPushButton::released,[this](){
button->setStyleSheet("background-image:url(your path);font: 13pt '黑体';color:black;"
"border-right: 2px solid white;"
"border-bottom: 2px solid white;"
"border-left: none;"
"border-top: none;");
});
实现效果
关于数据库连接后提取数据出现越界异常情况
因为我是把数据库单独写成一个类的,在从数据库提取完数据(QSqlQuery执行后的数据)之后直接将其存放在一维、二维数组里面,另一个模块所在的类使用这个数据库类对应的函数读取数据呈现到界面上。
但是在提取数据的时候总是会出现数组越界的快速检测异常中断
问题原因:因为没有在使用数组数据前检查数组内是否有数据,所以如果数据库中没有数据,那么在提取数据的时候就会出现数组越界的情况
问题解决:每次在使用数据库提取出的数据时,提前检查数组是否为空,这样能够防止出现异常,防止项目崩溃
关于项目中读取数据无法同步的问题(数据库新旧连接)
上面说到我把数据库的相关操作封装成一个类的情况下,在每个模块中new一个数据库的类,这样会导致另一个模块使用数据库的时候,另外其他模块的数据库类对象中的数据库连接会断开,这样再转到其他模块的时候数据没办法得到更新,没办法访问数据库
解决方法1:
使用单例模式,假设我的数据库类为mysqldb,相关的头文件和源文件名为mysqldb.h ,mysqldb.cpp
那么类中具体实现单例模式的懒汉式如下:
class Mysqldb : public QObject
{
Mysqldb()//放在外面是private的
{
}
static Mysqldb* dbb;
public:
static Mysqldb* getInstance()
{
if(dbb==nullptr)dbb=new Mysqldb;
return dbb;
}
virtual ~Mysqldb()
{
}
// ...其他操作
}
那么在其他模块中要使用mysql就没办法使用构造函数,只能
Mysqldb db;//写在.h文件中
db=Mysqldb::getInstance();//写在.cpp文件中
因为单例模式只能有一个实例,那么在每个模块访问的时候实际上就只能使用getinstance中的这一个实例对象了,解决了之前新旧连接和数据同步的问题
解决方法2:
其实还有很多方法可以实现数据库同步问题:
因为qt中数据库连接是需要有一个名字的(当然也可以缺省),只要数据库连接的名字不同,那么不同的数据库连接之间不会产生冲突(多线程下我没试过,不知道会不会出现脏读、误读之类的情况),也正因为这个情况,所以可以重写数据库类的构造函数,比如说在有参构造中加一个参数设置为数据库连接的名字,这样每个模块连接数据库的时候就会出现不同名字的数据库连接不会造成冲突
qt中二维数组排列与C++不同
我也是前不久才发现的,起因就是二维数组存储的QString没有按照行为主要排列的,当时没觉得有什么,但是到了之后总是忘记这一点,在这里记录一下加深记忆
在C++中,二维数组是按行主序(Row-Major Order)存储的,即连续存储每一行的元素。例如,以下代码创建了一个3行4列的二维数组:
int array[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
在内存中,这个二维数组按照如下的方式排列:
1 2 3 4 5 6 7 8 9 10 11 12
而在Qt中,二维数组是按列主序(Column-Major Order)存储的,即连续存储每一列的元素。Qt提供了QVector模板来表示二维数组。以下是一个使用QVector的示例:
QVector<QVector<int>> array{
{1, 5, 9},
{2, 6, 10},
{3, 7, 11},
{4, 8, 12}
};
在内存中,这个二维数组按照如下的方式排列:
1 2 3 4 5 6 7 8 9 10 11 12
可以看到,Qt的二维数组按照列主序进行存储。
因此,当在C++中使用传统的二维数组时,需要注意与Qt中的排列方式的区别,以免造成混淆。