用什么方法取得 QTreeWidget 中焦点所在行

用什么方法取得 QTreeWidget 中焦点所在行,第1张

1基本用法:

初始化用基本用到的:

//this->setMouseTracking(true);

this->setRootIsDecorated(false);

this->setSelectionMode(QAbstractItemView::ExtendedSelection);

this->setStyleSheet("QTreeWidget::item{height:25px}"); //设置行宽, 我也找不到提供的接口 setStyleSheet很强大建议看

this->setColumnWidth(0, 100); //设置列宽

this->setColumnCount(2);

QStringList lists;

lists << "NO" << "name";

this->setHeaderLabels(lists);

for (int i=0;i<10;i++)

{

QStringList contentList;

contentList << QString("00%1")arg(i) << "boy";

QTreeWidgetItem pNewItem = new QTreeWidgetItem(this, contentList); //增加

pNewItem->setBackgroundColor(0, QColor(150,0,0));

pNewItem->setFont(0, QFont());

}

//pNewItemRoot->setExpanded(true); //展开子项

增加删除顶层用:

addTopLevelItem(QTreeWidgetItem);

takeTopLeveltem(int);

topLevelItem(int); //返回

topLevelItemCount();

增加删除子层:

addChild(QTreeWidgetItem);

addChildren(const QList<QTreeWidgetItem>&);

takeChild(int);

takeChildren();

child(int) //返回

childCount();

2进价:

//加checkbox, icon

pNewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);

pNewItem->setCheckState(0, Qt::Unchecked);

//pNewItem->setIcon(int , QIcon);

//向ITEM里放一些QT的控件,如QSpinBox,QComboBox,QPushButton等

this->setItemWidget(pNewItem, 0, new QSpinBox());

//获取某项的QRect, 有时候会很有用,如显缩略图:

QRect rect = this->visualItemRect(QTreeWidgetItem);

//右键菜单重写

contextMenuEvent( QContextMenuEvent event );或者使用信号itemPressed(QTreeWidgetItem, int);

//对头的 *** 作,可以用QLabel或者QTreeWidgetItem对头进行初始化,

//隐藏头

header()->hide();

m_pHeaderView->setClickable(true); //能够发射sectionClicked(int)信号,可做菜单,显示隐藏列:setSectionHidden(int, bool);isSectionHidden(int);

m_pHeaderView->setMovable(true);

m_pHeaderView->setResizeMode(0, QHeaderView::Fixed); //固定列宽

m_pHeaderView->setDefaultSectionSize(100); //默认

//排序

treeWidget->setSortingEnabled(true);

treeWidget->header()->setSortIndicatorShown(true);

treeWidget->header()->setSortIndicator(0, Qt::AscendingOrder);

//要自定义就用信号

connect( treeWidget->header(), SIGNAL( sectionClicked(int) ), this, SLOT( sectionClickedSlot(int) ) );

在小项目里,使用qtreewidget完全足够,

如果想更多灵活用法请使用QTreeView等 MODEL/VIEW控件

This signal is emitted whenever the spin box's value is changed The new value's integer value is passed in i

当spin box的值发生改变时,这个信号将被发送。spin box的最新值将通过参数i传递。

value : int

This property holds the slider's current value

The slider forces the value to be within the legal range: minimum <= value <= maximum

Changing the value also changes the sliderPosition

这个属性为slider的当前值,slider将强制该值在最小值和最大值之间的合法范围内。slider的滑动块位置将与这个值的改变而同步改变。

Access functions:

int value () const

void setValue ( int )

Notifier signal:

通知信号:

void valueChanged ( int value )

设置范围可以使用 setRange ( int min, int max )

设置步调可以使用 setSingleStep ( int )

PS: The Best Way to learn QT is assistant。

自己emit一个信号,步骤如下(保证你这个两个cpp都对应的类是继承自QObject类):

准备两个cpp,一个是包含QSpinBox的cpp,一个是需要获得SpinBox改变的值

1、在QSpinBox的类中(可能是QWidget)中增加一个信号void spinBoxChanged(QString);

2、对于一个QSpinBox会有一个valueChanged的信号槽,假设你已经实现了这个槽函数中,并且在这个槽函数中得到了改变后的值,然后emit spinBoxChanged(changeValue);

3、再在另一个需要获得SpinBox的cpp对应的类(假设是QClass)中增加一个与信号函数的参数相同的槽函数

void slotSpinBoxChanged(QString)并实现之

4、连接两个对象的信号和槽,一般在初始化中连接

可能写的不太好懂,为了简单,你可以利用QT的一个信号对应多个槽的机制,不需要自己发信号,直接把槽函数和QSpinBox的valueChanged信号相连,这样就更简单了。

Qt的事件模型一个强大的功能是一个QObject对象能够监视发送其他QObject对象的事件,在事件到达之前对其进行处理。

假设我们有一个CustomerInfoDialog控件,由一些QLineEdit控件组成。我们希望使用Space键得到下一个QLineEdit的输入焦点。一个最直接的方法是继承QLineEdit重写keyPressEvent()函数,当点击了Space键时,调用focusNextChild():

void MyLineEdit::keyPressEvent(QKeyEvent event)

{

if (event->key() == Qt::Key_Space) {

focusNextChild();

} else {

QLineEdit::keyPressEvent(event);

}

}

这个方法有一个最大的缺点:如果我们在窗体中使用了很多不同类型的控件(QComboBox,QSpinBox等等),我们也要继承这些控件,重写它们的keyPressEvent()。一个更好的解决方法是让CustomerInfoDialog监视其子控件的键盘事件,在监视代码处实现以上功能。这就是事件过滤的方法。实现一个事件过滤包括两个步骤:

1 在目标对象上调用installEventFilter(),注册监视对象。

2 在监视对象的eventFilter()函数中处理目标对象的事件。

注册监视对象的位置是在CustomerInfoDialog的构造函数中:

CustomerInfoDialog::CustomerInfoDialog(QWidget parent)

: QDialog(parent)

{

firstNameEdit->installEventFilter(this);

lastNameEdit->installEventFilter(this);

cityEdit->installEventFilter(this);

phoneNumberEdit->installEventFilter(this);

}

事件过滤器注册后,发送到firstNameEdit,lastNameEdit,cityEdit,phoneNumberEdit控件的事件首先到达CustomerInfoDialog::eventFilter()函数,然后在到达最终的目的地。

下面是eventFilter()函数的代码:

bool CustomerInfoDialog::eventFilter(QObject target, QEvent event)

{

if (target == firstNameEdit || target == lastNameEdit

|| target == cityEdit || target == phoneNumberEdit) {

if (event->type() == QEvent::KeyPress) {

QKeyEvent keyEvent = static_cast(event);

if (keyEvent->key() == Qt::Key_Space) {

focusNextChild();

return true;

}

}

}

return QDialog::eventFilter(target, event);

}

首先,我们看是目标控件是否为QLineEdit,如果事件为键盘事件,把QEvent转换为QKeyEvent,确定被敲击的键。如果为Space键,调用focusNextChild(),把焦点交给下一个控件,返回true通知Qt已经处理了这个事件,如果返回false,Qt将会把事件传递给目标控件,把一个空格字符插入到QLineEdit中。

如果目标控件不是QLineEdit,或者事件不是Space敲击事件,把控制权交给基类QDialog的eventFilter()。目标控件也可以是基类QDialog正在监视的控件。(在Qt41中,QDialog没有监视的控件,但是Qt的其他控件类,如QScrollArea,监视一些它们的子控件)

Qt的事件处理有5中级别:

1 重写控件的事件处理函数:如重写keyPressEvent(),mousePressEvent()和paintEvent(),这是最常用的事件处理方法,我们已经看到过很多这样的例子了。

2 重写QObject::event(),在事件到达事件处理函数时处理它。在需要改变Tab键的惯用法时这样做。也可以处理那些没有特定事件处理函数的比较少见的事件类型(例如,QEvent::HoverEnter)。我们重写event()时,必须要调用基类的event(),由基类处理我们不需要处理的那些情况。

3 给QObject对象安装事件过滤器:对象用installEventFilter()后,所有达到目标控件的事件都首先到达监视对象的eventFilter()函数。如果一个对象有多个事件过滤器,过滤器按顺序激活,先到达最近安装的监视对象,最后到达最先安装的监视对象。

4 给QApplication安装事件过滤器,如果qApp(唯一的QApplication对象)安装了事件过滤器,程序中所有对象的事件都要送到eventFilter()函数中。这个方法在调试的时候非常有用,在处理非活动状态控件的鼠标事件时这个方法也很常用。

5 继承QApplication,重写notify()。Qt调用QApplication::nofity()来发送事件。重写这个函数是在其他事件过滤器处理事件前得到所有事件的唯一方法。通常事件过滤器是最有用的,因为在同一时间,可以有任意数量的事件过滤器,但是notify()函数只有一个。

许多事件类型,包括鼠标,键盘事件,是能够传播的。如果事件在到达目标对象的途中或者由目标对象处理掉,事件处理的过程会重新开始,不同的是这时的目标对象是原目标对象的父控件。这样从父控件再到父控件,知道有控件处理这个事件或者到达了最顶级的那个控件。

图72显示了一个键盘事件在一个对话框中从子控件到父控件的传播过程。当用户敲击一个键盘,时间首先发送到有焦点的控件上(这个例子中是QCheckBox)。如果QCheckBox没有处理这个事件,Qt把事件发送到QGroupBox中,如果仍然没有处理,则最后发送到QDialog中。

以上就是关于用什么方法取得 QTreeWidget 中焦点所在行全部的内容,包括:用什么方法取得 QTreeWidget 中焦点所在行、怎么在微调框QSpinBox之间切换焦点、如何实时取得QSpinBox的值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9317275.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存