我正在做一个继承自QitemDelegate的CheckBox的实现,把它放到QTableView中.
问题是我在插入时向左冲,我需要它居中.
据我所知,负责Paint的方法.我写的如下:
void CheckBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
bool checkValue;
QStyleOptionButton BtnStyle;
BtnStyle.state = QStyle::State_Enabled;
if(index.model()->data(index, Qt::DisplayRole).toBool() == true)
{
BtnStyle.state |= QStyle::State_On;
checkValue = true;
}else{
BtnStyle.state |= QStyle::State_Off;
checkValue = false;
}
BtnStyle.direction = QApplication::layoutDirection();
BtnStyle.rect = option.rect;
QApplication::style()->drawControl(QStyle::CE_CheckBox,&BtnStyle,painter );
QApplication::style()->drawControl(QStyle::CE_CheckBox,&BtnStyle,painter );
}
Run Code Online (Sandbox Code Playgroud)
什么缺少出现居中?
所以我有委托:
.H
class BooleanWidget : public QWidget
{
Q_OBJECT
QCheckBox * checkBox;
public:
BooleanWidget(QWidget * parent = 0)
{
checkBox = new QCheckBox(this);
QHBoxLayout * layout = new …Run Code Online (Sandbox Code Playgroud) 如果设置固定的复选框大小,则文本将与复选框本身对齐.使用标准布局方向,文本将在框后面开始,并且从右到左布局它将在框之前结束,就像这样(边框只是窗口小部件的边框以指示窗口小部件的实际大小,不要混淆):

有没有办法将文本与另一方对齐以实现此目的:

我有一个带有复选框的列QTableView。该复选框由以下生成:
Qt::ItemIsUserCheckable覆盖的flags成员函数data()函数中,我根据数据返回一个Qt::CheckStateforrole == Qt::CheckStateRole有效,见截图。
但在复选框旁边,我在列中有一些可编辑的文本框。我怎样才能摆脱这个文本框(我在其中输入了“dsdsdsds”进行演示?澄清一下,复选框应该是可编辑的,但没有别的。

根据要求,我只能显示简化版
Qt::ItemFlags MyClass::flags(const QModelIndex &index) const {
Qt::ItemFlags f = QAbstractListModel::flags(index);
... return f if index is not target column ....
// for target column with checkbox
return (f | Qt::ItemIsEditable | Qt::ItemIsUserCheckable; )
}
QVariant MyClass::data(const QModelIndex &index, int role) const {
.. do something for other columns
.. for checkbox column
if (role != Qt::CheckStateRole) { …Run Code Online (Sandbox Code Playgroud) 我在网格布局中有一个QCheckbox,定义如下:
self.isSubfactorCheckbox = QtGui.QCheckBox('Is &subfactor', self)
Run Code Online (Sandbox Code Playgroud)
默认情况下,该复选框位于"Is subfactor"文本的左侧.我希望将其移至案文右侧.
我试过玩次控制位置,但无济于事.
self.isSubfactorCheckbox.setStyleSheet('QCheckBox::indicator{subcontrol-origin: content; subcontrol-position: top right;}')
Run Code Online (Sandbox Code Playgroud)
这会将复选框向右移动(它仍然在文本的左侧),但它会将文本向右推出窗口的边缘.
这无助于将文本移到右侧:
self.isSubfactorCheckbox.setStyleSheet('QCheckBox::text{subcontrol-origin: content; subcontrol-position: top left; }')
Run Code Online (Sandbox Code Playgroud)
一个解决方案是创建一个QLabel并在其右侧添加复选框,但我没有找到一种方法来在QLabel中加下划线字母,以便用户知道哪个是快捷键.我已经尝试用字母前缀字母和/或将它们包装在<u> </u>标签中.
我仍然只想使用QLabel,但是如何在没有文本被推出的情况下将复选框切换到文本的右侧.
我有一个水平的QListView,我想使用样式表自定义内部的复选框和标签,以将标签放在复选框下方,而不是右侧。
如何做呢?
我有一个MyDelegate用于QListWidget. 委托派生自QStyledItemDelegate. 的目标之一MyDelegate是在ListWidget. 它是在以下paint()事件中完成的MyDelegate:
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyledItemDelegate::paint(painter, option, index);
// ... drawing other delegate elements
QStyleOptionButton checkbox;
// setting up checkbox's size and position
// now draw the checkbox
QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkbox, painter);
}
Run Code Online (Sandbox Code Playgroud)
起初我认为复选框会在单击时自动更改其状态,因为我指定了QStyle::CE_CheckBox. 但事实并非如此。看起来我必须手动指定复选框的视觉行为。
数据方面,当用户单击该复选框时,会发出某些信号并更改场景数据。我在editorEvent()以下位置执行此操作:
bool MyDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
if (event->type() == QEvent::MouseButtonRelease) { …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 PyQt4 中实现一个系统,其中取消选中复选框将调用函数disable_mod,选中它将调用enable_mod。但即使状态正在改变,复选框也会调用它们开始时的初始函数。对于这种情况,如果单击了已经选中的框,它总是会继续调用disable_mod函数!我不明白为什么会发生这种情况?你们能帮我一下吗?这是我的代码:
from PyQt4 import QtCore, QtGui
from os import walk
from os.path import join
import sys
def list_files_regex(dir):
l = []
for (root, dirnames, filenames) in walk(dir):
for d in dirnames:
list_files_regex(join(root, d))
l.extend(filenames)
return l
directory = "J:/test_pack"
directory = join(directory, "/mods")
count = 0
for y in list_files_regex(directory):
print y
count += 1
print count
class ModEdit(QtGui.QMainWindow):
def __init__(self, title, icon, x, y, w, h):
super(ModEdit, self).__init__()
self.setWindowTitle(title)
self.setWindowIcon(QtGui.QIcon(icon))
self.setGeometry(x, y, w, h)
self.choices = [] …Run Code Online (Sandbox Code Playgroud) 我正在尝试进行一些验证,例如:
但是,当我运行此代码时,单击任何复选框将取消选中所有 3个复选框。
即窗口初始化时选中“未选择”。但是,当我单击“选择A”时,它取消了“未选择”的选择,但没有选中“选择A”。
我究竟做错了什么?
import sys
import PyQt5
class Test(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
checkBoxNone = QCheckBox("None Selected")
checkBoxA = QCheckBox("Select A")
checkBoxB = QCheckBox("Select B")
checkBoxNone.setChecked(True)
checkBoxNone.stateChanged.connect(lambda checked: (checkBoxA.setChecked(False), checkBoxB.setChecked(False)))
checkBoxA.stateChanged.connect(lambda checked: checkBoxNone.setChecked(False))
checkBoxB.stateChanged.connect(lambda checked: checkBoxNone.setChecked(False))
grid = QGridLayout()
grid.addWidget(checkBoxNone, 1, 0)
grid.addWidget(checkBoxA, 2, 0)
grid.addWidget(checkBoxB, 3, 0)
self.setLayout(grid)
self.setWindowTitle('Test')
self.show()
if __name__ == '__main__': …Run Code Online (Sandbox Code Playgroud) 我试图只改变QCheckBox指示矩形的颜色.
目前我成功绘制了矩形的右边和底线.可能我在这里做错了.
这是我的代码:
CheckBoxWidget.cpp
CheckBoxWidget::CheckBoxWidget(QObject *poParent)
: QItemDelegate(poParent)
{
}
void CheckBoxWidget::drawCheck( QPainter *painter,
const QStyleOptionViewItem &option,
const QRect & rect,
Qt::CheckState state) const
{
QRect oCheckBoxRect =
QApplication::style()->subElementRect( QStyle::SE_CheckBoxIndicator, &option);
painter->setPen(Qt::white);
painter->drawRect(oCheckBoxRect);
QItemDelegate::drawCheck(painter, option, oCheckBoxRect, state);
}
Run Code Online (Sandbox Code Playgroud)
CheckBoxWidget.h
class CheckBoxWidget : public QItemDelegate
{
Q_OBJECT
public:
CheckBoxWidget(QObject *poParent = 0);
virtual ~CheckBoxWidget();
protected:
virtual void drawCheck( QPainter *painter,
const QStyleOptionViewItem &option,
const QRect &,
Qt::CheckState state) const;
};
Run Code Online (Sandbox Code Playgroud)
有什么建议 ?
我正在尝试向 QTableWidget 中的每一行添加一个复选框,不幸的是它似乎只出现在第一行。这是我的代码:
data = ['first_row', 'second_row', 'third_row']
nb_row = len(data)
nb_col = 2
qTable = self.dockwidget.tableWidget
qTable.setRowCount(nb_row)
qTable.setColumnCount(nb_col)
chkBoxItem = QTableWidgetItem()
for row in range(nb_row):
for col in [0]:
item = QTableWidgetItem(str(data[row]))
qTable.setItem(row,col,item)
for col in [1]:
chkBoxItem.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
chkBoxItem.setCheckState(QtCore.Qt.Unchecked)
qTable.setItem(row,col,chkBoxItem)
Run Code Online (Sandbox Code Playgroud)
我错过了一些明显的东西吗?
我还检查了以下帖子:
qcheckbox ×11
qt ×8
pyqt ×4
c++ ×3
python ×3
qtableview ×2
lambda ×1
pyqt4 ×1
pyqt5 ×1
qlistview ×1
qt5.3 ×1
qtablewidget ×1
qwidget ×1
stylesheet ×1