Expanding和Preferred的区别: 当一个Form包含两个widget时,form大小变化时额外的空白处给予expanding widget,而preferred widget保持气其大小为sizeHint.
自定义一个控件,重写他的sizeHInt
public :
virtual QSize sizeHInt( ) const ;
QSize PushBtton :: sizeHint() const
{
return Qsize(80,100);
}
button中的mousetracing属性: true : 鼠标不用按下就可以触发mouseMove事件;
toolbutton
d_ptr->m_comboBoxFactory = new QtEnumEditorFactory(this);
const int enumId = QtVariantPropertyManager::enumTypeId();
d_ptr->m_factoryToType[d_ptr->m_comboBoxFactory] = enumId;
d_ptr->m_typeToFactory[enumId] = d_ptr->m_comboBoxFactory;
QSizeGrip
在dialog和statusbar中又sizegrip
自定义的时候需要手动定位到右下角
QSplashScreen
QStatusBar(状态条)和QToolBar(工具栏)和QMenubar(菜单栏)
QWidgetAction 继承自QAction
QTabBar.没啥好看的
QToolTip 为任何其他的widget提供 tool tips
指定打开方式
);信号的block: 被block的信后,在block结束后,不会再自动发出;
QDatastream和QTextStream
QTemporaryFile: 临时文件.
QTemporaryDir
QSaveFile 安全写文件,保证写的文件不会丢失.写完有commit提交操作.
QSettings操作INI文件(INI格式另外了解)
中文的时候需要设置codec(GBK 或者GB2312或者 UTF-8),否则会出现奇奇怪怪的东西
自定义类中的自定义枚举,如下操作
#include
class Car : public QObject
{
Q_OBJECT
public:
Car(QObject *parent = 0) {}
~Car() {}
enum Color { RED, GREEN, BLUE };
Q_ENUM(Color)
};
main.cpp部分代码
QMetaEnum metaColor = QMetaEnum::fromType<Car::Color>();
bool isOk = false;
qDebug()<<metaColor.valueToKey(Car::BLUE);
qDebug()<<metaColor.keyToValue("BLUE", &isOk)<<isOk; // OR
qDebug()<<metaColor.keyToValue("Car::BLUE", &isOk)<<isOk;
————————————————
版权声明:本段代码为CSDN博主「Qt君」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/nicai_xiaoqinxi/article/details/90019691
Q_SIGNALS:
void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
void currentChanged(const QModelIndex ¤t, const QModelIndex &previous);
void currentRowChanged(const QModelIndex ¤t, const QModelIndex &previous);
void currentColumnChanged(const QModelIndex ¤t, const QModelIndex &previous);
void modelChanged(QAbstractItemModel *model);
一般如果设置选中模式为单个元素,那么使用currentChanged信号即可;
如果是单行,那么使用currentRowChanged信号即可;
如果是多选,一般使用selectionChanged信号。
其他不常用,使用方法类似,根据情况选用。
3,槽函数处理
1,定义对应的槽函数(这里3个信号都处理,是为了演示用法,实际一般只处理其中一种信号)
private:
void slotSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
void slotCurrentChanged(const QModelIndex ¤t, const QModelIndex &previous);
void slotCurrentRowChanged(const QModelIndex ¤t, const QModelIndex &previous);
2,绑定信号
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
InitTree();
connect(ui->treeView->selectionModel(),&QItemSelectionModel::selectionChanged,this,&MainWindow::slotSelectionChanged);
connect(ui->treeView->selectionModel(),&QItemSelectionModel::currentChanged,this,&MainWindow::slotCurrentChanged);
connect(ui->treeView->selectionModel(),&QItemSelectionModel::currentRowChanged,this,&MainWindow::slotCurrentRowChanged);
}
3,槽函数实现
//选中内容变化,覆盖单选和多选的情况
void MainWindow::slotSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
{
QItemSelectionModel *selections = ui->treeView->selectionModel();
QModelIndexList indexes = selections->selectedIndexes(); //得到所有选中的index
foreach(QModelIndex index, indexes)
{
//从索引index获取item指针,mModel是tree的数据Model,这里是QStandardItemModel*类型
QStandardItem* item = mModel->itemFromIndex(index);
if (item)
{
//你的操作,比如取文本、取附带的data
//QString text = item->text();
//QString data1 = item->data(Qt::UserRole + 1).toString();
//QString data2 = item->data(Qt::UserRole + 2).toInt();
}
}
}
//当前选中index变化,单个
void MainWindow::slotCurrentChanged(const QModelIndex ¤t, const QModelIndex &previous)
{
QStandardItem* item = mModel->itemFromIndex(current);
if (item)
{
//你的操作,同上
}
}
//当前选中行变化,单行
void MainWindow::slotCurrentRowChanged(const QModelIndex ¤t, const QModelIndex &previous)
{
//取选中的这行的第一个元素的index
QModelIndex index = current.sibling(current.row(),0);
QStandardItem* item = mModel->itemFromIndex(index);
if(item)
{
//你的操作,同上
}
}
model->item()
获取的QstandardItem是最顶层样式的model下的QStandardItem,它是忽略child QStandardItem的.QString().isNull(); // returns true
QString("").isNull(); // returns false
QString(“abc”).isNull(); // returns false 和 Java中一样嘛zzzzz
QByteArray 有中文时会出现乱码问题:
QProcess启动外部程序的 踩坑:
使用start可以设置外部程序的工作目录;
使用execute设置无效,只能继承主程序的工作目录,这就会导致一个问题,如果外部程序使用了相对路径访问自己程序所在文件夹的下层文件,将无法找到文件!
//这里document是一个QJsonDocument
QVariantList list = document.toVariant().toList();
for(int i = 0; i<list.count(); i++)
{
QVariantMap map = list[i].toMap();
qInfo()<<map["name"].toString();
qInfo()<<map["age"].toString();
}