文章目录
样式表
属性选择器动态切换无效
QLineEdit[urgent=true]
{
color: red;
}
使用这种方式有局限性。最主要的是当一个属性值变化时,所引用的样式不会自动更新。
相反地,必须手动触发更新才会生效。
unpolish()用于清理之前的样式,而polish()则用于添加新的样式。
lineEdit->setProperty(“urgent”, true);
lineEdit->style()->unpolish(lineEdit);
lineEdit->style()->polish(lineEdit);
必须在组件的样式中使用,QStyle::polish既接受QWidge也接受QApplication作为参数。
QToolBox
- QToolBox设置tab高度
QToolBoxButton
{
min-height: 30px; //控制tab高度
}
-
样式类型
-
设置文字对齐方式 重写drawItemText
class MyTabStyle: public QProxyStyle
{
virtual void drawItemText(QPainter* painter, const QRect& rectangle, int alignment,
const QPalette& palette, bool enabled, const QString& text,
QPalette::ColorRole textRole ) const override
{
alignment = Qt::AlignHCenter | Qt::AlignVCenter ;
QProxyStyle::drawItemText(painter, rectangle, alignment, palette, enabled,text, textRole );
}
};
QScrollArea
QScrollArea添加布局后没有出现滚动条
QWidget *widget = new QWidget;
widget->setLayout(scrollAreaLayout);
滚动区域的布局不直接设置给滚动区域,创建了一个QWidget,布局中添加控件
之后将这个QWidget设置为滚动区域的QWidget,如下:
scrollArea->setWidget(widget);
同时设置如下属性:
scrollArea->setWidgetResizable(true);
QSPlitter
setStretchFactor(0, 3); // 设置两个控件的比例为3:1
setStretchFactor(1, 1);
setCollapsible(0, false); // 设置两个控件拖到最小时不会被隐藏
setCollapsible(0, false);
QWidget
- 从QWidget派生了窗体后,使用stylesheet设置背景,在designer中可以看到效果,运行没有背景,因为QWidget的paintEven()是空,而样式表需要通过paint被会知道窗口中。
void CusWidget::paintEvent(QPaintEvent *eveny)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
QTextEdit
- 当主窗体设置setAttribute(Qt::WA_TranslucentBackground)即背景透明后,如果还想让输入控件(QTextEdit,QLineEdit,QPlainText)背景透明,需要设置控件无边框。
setFrameStyle(QFrame::NoFrame);
QListWidget
- 设置样式表无效
setFrameShape(QListWidget::NoFrame);
- 设置背景斑马色
setAlternatingRowColors(true);
setStyleSheet("alternate-background-color:rgb(11,231,255);background-color:rgb(222,191,255)");
QTableWidget
- 设置水平滚动条平滑滑动,而不是一块一块移动
table_wgt->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
- Tablewidget 删除item 需要调用removerow 能将item 一起移除掉,takeitem ,clear ,clearcontext 只能清空item上的文字或控件。
- 设置最后一列拉伸铺满
table_wg-t>horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
table_wgt->horizontalHeader()->setStretchLastSection(true); // 最后一列拉伸铺满
- 设置选中时选中整行
table_wgt->setSelectionBehavior(QAbstractItemView::SelectRows);
- 设置只能选中一行
table_wgt->setSelectionMode(QAbstractItemView::SingleSelection);
- 设置选中item时,item的背景颜色
table_wgt->setStyleSheet("QTableView::item{selection-background-color:rgba(220,220,220,255)}");
- 设置不可编辑
table_wgt->setEditTriggers(QAbstractItemView::NoEditTriggers);
QTableView
- 重写QAbastractTableModel之后,调用insertrows()函数前要先调用beginInsertRows()函数,调用beginInsertRows()后,Qt会自动调用rowCount()函数,要在rowCount()将行数处理正确,不然insert出来的行无法编辑。
QTreeWidget
- 遍历widget
QTreeWidgetItemIterator item(tree_wgt);
while(*item)
{
(*item)-> ...
++item;
}
- 设置某一列可编辑或不可编辑
注意:
调用 QTreeWidget::closePersistentEditor() 函数可以关闭一个永久编辑器,以便让用户对节点进行编辑。但是,如果节点的 Qt::ItemIsEditable 标志被设置为可编辑,用户仍然可以通过双击或者按下 F2 键来编辑节点,即使你已经调用了 QTreeWidget::closePersistentEditor() 函数。
QObject::connect(treeWidget,SIGNAL(itemDoubleClicked ( QTreeWidgetItem*, int)),
this,SLOT(openPersistentEditor(QTreeWidgetItem*,int)));
QObject::connect(treeWidget,SIGNAL(itemSelectionChanged ()),
this,SLOT(slotSelectionChanged()));
void CMainWindow::openPersistentEditor(QTreeWidgetItem* item,int column)
{
if( 1 == column )
{
treeWidget->openPersistentEditor(item,column);
lastOpen = item;
}
}
void CMainWindow::slotSelectionChanged()
{
if( NULL!= lastOpen )
{
treeWidget->closePersistentEditor(lastOpen,1);
lastOpen = NULL;
}
- 设置选中不显示虚线框
QTreeview->setFocusPolicy(Qt::NoFocus);
QComboBox
- 大量数据加载速度过慢解决办法
void CusBox::slotBox(QComboBox *combo)
{
// QT官方建议
combo->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength);
QListView *view = (QListView *)combo->view();
// 显示大小相等的项时,设置uniformItemSizes属性为true。
view->setUniformItemSizes(true);
// 批量布局
view->setLayoutMode(QListView::Batched);
}