PyQt - 为循环创建菜单:

时间:2017-03-21 10:13:36

标签: python user-interface for-loop menu pyqt4

我有

形式的分析数据CSV文件
Continent:     CT:  Country:    Count:
North America  GT   Guatemala   1
...            ...  ...         ...

我想用来制作一个国家'我的PyQT GUI中的菜单如下所示:

Menu made manually

正如您所看到的,我想首先创建一个大陆菜单(可以忽略热门国家/地区),然后将国家/地区添加到数据中显示的每个大陆。到目前为止,我有这个代码,除了加载一个空白的GUI之外什么都不做:

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
    MainWindow.setObjectName(_fromUtf8("Country-Wise Analytics"))
    MainWindow.resize(900, 700)

    self.menubar = QtGui.QMenuBar(MainWindow)
    self.menubar.setGeometry(QtCore.QRect(0, 0, 867, 22))
    self.menubar.setObjectName(_fromUtf8("menubar"))
    self.menuCountry = QtGui.QMenu(self.menubar)
    self.menuCountry.setObjectName(_fromUtf8("menuCountry"))
    self.menuPlatform = QtGui.QMenu(self.menubar)
    self.menuPlatform.setObjectName(_fromUtf8("menuPlatform"))
    MainWindow.setMenuBar(self.menubar)
    self.statusbar = QtGui.QStatusBar(MainWindow)
    self.statusbar.setObjectName(_fromUtf8("statusbar"))
    MainWindow.setStatusBar(self.statusbar)

    cnts = []
    DIR = '/Users/jonathan/Documents/CountryWiseAnalytics/'
    with open(DIR + 'UsersPerCountry.csv', 'r') as UPC:
        UsersCountry = csv.DictReader(UPC, restval=None, restkey=None, dialect='excel')
        for row in UsersCountry:
            cnt = row['Continent:']
            if cnt not in cnts:
                cnts.append(cnt)
                self.menucnt = QtGui.QMenu(self.menuCountry)
                self.menucnt.setObjectName(_fromUtf8(cnt))

2 个答案:

答案 0 :(得分:1)

我会cnts成为dict,而不是list[])。

dict QtGui.QMenu从大陆名称到self.menucnt.addMenu(cnt) cnt_menu = cnts.setdefault(cnt, self.menucnt.addMenu(cnt)) cnt_menu.addAction(row['Country:']) 。 然后它会给你正确的QMenu来添加QAction。

类似的东西:

ImageView imageView = (ImageView) findViewById(R.id.imageView);
    Glide.with(this)
            .load("https://api.backendless.com/CF512434-CCA8-067C-FF92-D76481A44000/v1/files/profilePhotos/mubtada.syedprofileImage.png")
            .placeholder(new ColorDrawable(ContextCompat.getColor(MainActivity.this, R.color.placeholder_gray)))
            .error(new ColorDrawable(ContextCompat.getColor(MainActivity.this, R.color.placeholder_gray)))
            .into(imageView);

cf http://pyqt.sourceforge.net/Docs/PyQt4/qmenu.html

[编辑]

我不会通过直接调用构造函数来创建菜单和menuitems,而是使用menuItem容器中的add *方法,给出我想要看到的名称。 直接调用构造函数,只需设置内存管理链接,而不是包含链接。

Cf http://doc.qt.io/qt-4.8/objecttrees.html

顺便问一下,你确定需要setObjectName吗?

答案 1 :(得分:0)

工作回答:

Continents = {}
    CTs = {}
    popCT = ['United States', 'United Kingdom', 'South Africa', 'Germany', 'India', 'Australia', 'Canada', 'Italy', 'Sweden' ,\
    'Netherlands', 'France', 'New Zealand', 'Belgium', 'Switzerland', 'Norway', 'Brazil', 'Indonesia', 'Russia', \
    'United Arab Emirates', 'Spain', 'Denmark']
    DIR = '/Users/jonathan/Documents/CountryWiseAnalytics/'
    with open(DIR + 'UsersPerCountry.csv', 'r') as UPC:
        UsersCountry = csv.DictReader(UPC, restval=None, restkey=None, dialect='excel')
        for row in UsersCountry:
            Continent = row['Continent:']
            continentMenu = Continents.get(Continent, None)
            if continentMenu is None:
                continentMenu = self.menuCountry.addMenu(Continent)
                Continents[Continent] = continentMenu
            countryAction = continentMenu.addAction(row['Country:'])
            CT = row['Country:']
            if CT in popCT:
                self.actionCT = QtGui.QAction(self.menuPopular_Countries)
                self.actionCT.setObjectName(_fromUtf8(CT))
                CTMenu = CTs.setdefault(CT, self.menuPopular_Countries.addAction(CT))