Python QT4(PyQt4)QTableWidget信号在应该触发时未触发
我正在编写一个论坛帖子数据库的接口 在上面的程序中,有一个工具箱小部件,其中包含两个主题浏览器处于活动状态的小部件。主题浏览器由一个垂直布局的父QFrame组成,该框架包含主题论坛类别标签、导航控制小部件和小部件主体(即Python QT4(PyQt4)QTableWidget信号在应该触发时未触发,python,qt,user-interface,qt4,pyqt,Python,Qt,User Interface,Qt4,Pyqt,我正在编写一个论坛帖子数据库的接口 在上面的程序中,有一个工具箱小部件,其中包含两个主题浏览器处于活动状态的小部件。主题浏览器由一个垂直布局的父QFrame组成,该框架包含主题论坛类别标签、导航控制小部件和小部件主体(即QTableWidget(QTW))。QTW选择行为为qabstractemview.SelectRows 问题是,当我将函数连接到itemClicked()信号时,仅当我在posts和Views列中选择一个单元格时,信号才会触发,但当我单击主题name单元格时,信号不会触发。我
QTableWidget
(QTW))。QTW选择行为为qabstractemview.SelectRows
问题是,当我将函数连接到itemClicked()
信号时,仅当我在posts
和Views
列中选择一个单元格时,信号才会触发,但当我单击主题name
单元格时,信号不会触发。我试过其他信号,他们也有同样的行为。需要注意的一点是,名称的第一个字符略微模糊。所以我想这可能是造成问题的原因
有什么建议吗
编辑
设置表的代码
class ForumTopicWidget(QFrame):
def __init__(self,db):
QFrame.__init__(self)
self._db=db
self._rowcount = 21
self._current_page = 1
self._forum_id = None
self._category_id = None
self._navigation_widget = NavigationHeadWidget()
self._layout = QVBoxLayout()
self._title_label = QLabel()
self._title_label.setText("<b>Topics</b>")
self._title_label.setAlignment(Qt.AlignCenter)
self._layout.addWidget(self._title_label)
self._layout.addWidget(self._navigation_widget)
self._topic_list = QTableWidget()
#self._topic_list.setMinimumWidth(600)
self._topic_list.setRowCount(self._rowcount)
self._topic_list.setColumnCount(3)
self._topic_list.setHorizontalHeaderLabels(["Name","Posts", "Views"])
self._topic_list.horizontalHeader().setResizeMode(0,QHeaderView.Stretch)
self._topic_list.verticalHeader().setVisible(False)
#self._topic_list.setColumnWidth(0,476)
self._topic_list.setColumnWidth(1,61)
self._topic_list.setColumnWidth(2,61)
self._topic_list.setSelectionBehavior(QAbstractItemView.SelectRows)
self._layout.addWidget(self._topic_list)
self.setLayout(self._layout)
self.setFrameStyle(QFrame.WinPanel)
self._topic_list.cellClicked.connect(self.cell_clicked)
self._navigation_widget.set_nav_functions(self._shift_first,
self._shift_prev,
self._shift_next,
self._shift_last)
self.page_ids = []
def cell_clicked(self,item):
self._prime_topic(self.page_ids[item])
def set_item_click_function(self,function):
self._prime_topic = function
def set_initial_state(self, category_id, forum_name):
self._category_id = category_id
self._topic_count = self._db.get_topic_count(category_id)
self._last_page = int(ceil(float(self._topic_count) / self._rowcount))
self.shift_state(1)
self._title_label.setText("<b> %s Topics</b>" % forum_name)
def shift_state(self, new_page):
self._current_page = new_page
self.populate_page(new_page)
self._navigation_widget.set_pagination_string(self._current_page,
self._last_page)
def _shift_first(self):
self.shift_state(1)
self._current_page = 1
def _shift_prev(self):
if self._current_page != 1:
self._current_page = self._current_page - 1
self.shift_state(self._current_page)
def _shift_next(self):
if self._current_page != self._last_page:
self._current_page = self._current_page + 1
self.shift_state(self._current_page)
def _shift_last(self):
self.shift_state(self._last_page)
def populate_page(self,page_number):
pages = self._db.get_paginated_topics(self._category_id,page_number,self._rowcount);
i=0
self.page_ids[:]=[]
for page in pages:
self.page_ids.append(page.id)
q = QLabel()
q.setText('<font size ="3">%s</font>' % page.title)
self._topic_list.setCellWidget(i,0, q)
pc = QTableWidgetItem(str(page.post_count))
vc = QTableWidgetItem(str(page.view_count))
pc.setFlags(QtCore.Qt.ItemIsEnabled)
#pc.setFlags(QtCore.Qt.ItemIsEnabled)
self._topic_list.setItem(i,1, pc)
self._topic_list.setItem(i,2, vc)
i = i +1
class-ForumTopicWidget(QFrame):
定义初始化(自我,数据库):
QFrame.\uuuuu初始化\uuuuuu(自)
自。_db=db
自。_行数=21
self.\u当前页面=1
self.\u论坛\u id=None
self.\u category\u id=None
self.\u navigation\u widget=NavigationHeadWidget()
self.\u layout=QVBoxLayout()
self.\u title\u label=QLabel()
self.\u title\u label.setText(“主题”)
self.\u title\u label.setAlignment(Qt.AlignCenter)
self.\u layout.addWidget(self.\u title\u标签)
self.\u layout.addWidget(self.\u导航\u小部件)
self.\u topic\u list=QTableWidget()
#自我主题列表。设置最小宽度(600)
self.\u topic\u list.setRowCount(self.\u rowcount)
self.\u topic\u list.setColumnCount(3)
self.\u topic\u list.setHorizontalHeaderLabels([“名称”、“帖子”、“视图”])
self.\u topic\u list.horizontalHeader().setResizeMode(0,QHeaderView.Stretch)
self.\u topic\u list.verticalHeader().setVisible(False)
#self.\u topic\u list.setColumnWidth(0476)
self._topic_list.setColumnWidth(1,61)
self._topic_list.setColumnWidth(2,61)
self.\u topic\u list.setSelectionBehavior(QAbstractItemView.SelectRows)
self.\u layout.addWidget(self.\u主题\u列表)
self.setLayout(self.\u布局)
self.setFrameStyle(QFrame.WinPanel)
self.\u topic\u list.cellClicked.connect(self.cell\u clicked)
self.\u导航\u小部件。设置导航功能(self.\u shift\u优先,
自身.\u shift\u prev,
self.\u shift\u下一步,
自我。_班次(最后一班)
self.page_id=[]
已单击def单元(自身,项目):
self.\u prime\u主题(self.page\u id[项目])
def设置项目点击功能(自身,功能):
self.\u prime\u topic=函数
def设置初始状态(自身、类别id、论坛名称):
self.\u category\u id=category\u id
self.\u topic\u count=self.\u db.get\u topic\u count(类别id)
self.\u last\u page=int(ceil(浮动(self.\u主题\u计数)/self.\u行计数))
自换档状态(1)
self.\u title\u label.setText(“%s主题”%forum\u name)
def shift_状态(自身,新页面):
self.\u当前页面=新页面
自我填充页面(新页面)
self.\u导航\u小部件。设置分页\u字符串(self.\u当前\u页面,
自我(最后一页)
def _先换档(自):
自换档状态(1)
self.\u当前页面=1
def\U shift\U prev(自):
如果是自己的话。_当前_页面!=1:
self.\u当前页面=self.\u当前页面-1
self.shift\u状态(self.\u当前页面)
def_shift_next(自):
如果是自己的话。_当前_页面!=self.\u最后一页:
self.\u当前页面=self.\u当前页面+1
self.shift\u状态(self.\u当前页面)
def_shift_last(自):
self.shift\u状态(self.\u最后一页)
def填充页面(自身,页面编号):
pages=self.\u db.获取分页主题(self.\u类别\u id、页码、self.\u行数);
i=0
self.page_id[:]=[]
对于页面中的页面:
self.page\u id.append(page.id)
q=QLabel()
q、 setText(“%s”%page.title)
self.\u topic\u list.setCellWidget(i,0,q)
pc=QTableWidgetItem(str(第页后计数))
vc=QTableWidgetItem(str(页面视图计数))
pc.setFlags(QtCore.Qt.ItemIsEnabled)
#pc.setFlags(QtCore.Qt.ItemIsEnabled)
self.\u topic\u list.setItem(i、1、pc)
self.\u topic\u list.setItem(i、2、vc)
i=i+1
这个问题出现在OS X和Linux上。freenode上irc频道#qt的Sqwishy指出了我的错误
第一列包含QLabel
,而不是标准文本。Qlabel有自己的信号。第二列是表管理信号的类型。我之所以使用标签而不是QTableWidgetItem
,是因为我想调整字体大小,并认为这是唯一的方法
“填充页面”方法应如下所示:
def populate_page(self,page_number):
pages =\
self._db.get_paginated_topics(self._category_id,page_number,self._rowcount);
i=0
self.page_ids[:]=[]
for page in pages:
self.page_ids.append(page.id)
nc = QTableWidgetItem(str(page.title))
pc = QTableWidgetItem(str(page.post_count))
vc = QTableWidgetItem(str(page.view_count))
self._topic_list.setItem(i,0,nc)
self._topic_list.setItem(i,1, pc)
self._topic_list.setItem(i,2, vc)
i = i +1
freenode上irc频道#qt的Sqwishy指出了我的错误
第一列包含QLabel
,而不是标准文本。Qlabel有自己的信号。第二列是表管理信号的类型。我之所以使用标签而不是QTableWidgetItem
,是因为我想调整字体大小,并认为这是唯一的方法
“填充页面”方法应如下所示:
def populate_page(self,page_number):
pages =\
self._db.get_paginated_topics(self._category_id,page_number,self._rowcount);
i=0
self.page_ids[:]=[]
for page in pages:
self.page_ids.append(page.id)
nc = QTableWidgetItem(str(page.title))
pc = QTableWidgetItem(str(page.post_count))
vc = QTableWidgetItem(str(page.view_count))
self._topic_list.setItem(i,0,nc)
self._topic_list.setItem(i,1, pc)
self._topic_list.setItem(i,2, vc)
i = i +1